我是一个iOS开发人员,犹记得公司刚开始让我写网页的时候,写JavaScript无提示和编译不检查错误以及不知如何在HTML里面调用JavaScript函数等问题让我痛苦不堪,一度觉得这是一门很烂的语言,随着这两年在公司陆陆续续地写了一些网页,逐渐对JavaScript有了一些认识,发现JavaScript极其灵活,后来学了一段时间node.js,JavaScript还可以用来写后端,才越发发现JavaScript的强大,我仍然是一个小白,对JavaScript没有系统地学过,一直都是边用边学,在此,写此文目的,算是重新学习一遍JavaScript,往后有时间再写一下angularjs和node.js的学习笔记。
一、JavaScript一般来讲分为3个部分:
1. ECMAScript:JavaScript的语法核心
2. DOM:文档对象模型,HTML各个节点,JavaScript可以操作DOM
3. BOM:浏览器对象模型,JavaScript对浏览器进行操作
本文只写一下JavaScript的语法核心的部分,接触了angularJS和node.js,发现对这两门技术不理解的最根本的问题还是对JavaScript理解得太少了
二、原始值和引用值
1. 原始值:存放在栈中的简单数据,如 var a = 3, b = a; 此时,a, b是两个独立的互不影响的变量,修改b的值不会影响到a,我们称 a, b 为原始值,在JavaScript中,原始值有5种:null,undefined,Number,Boolean,String
2. 引用值:存放在堆内存的对象数据,如var obj = new Object(); 此时的obj本质上是一个指针,指向一个对象的堆内存地址。
var obj1 = new Object(); obj1.name = "zhang"; var obj2 = obj1; obj2.name = "li"; console.log(obj1.name); // "li"
以上例子中,obj2 与 obj1 两个指针都指向同一个对象,当修改obj2.name时,obj1.name 也同时改变,这应该是任何程序员都知道的概念。
三、undefined与null
在JavaScript中,undefined并不表示未定义的对象,它只是代表改变量未初始化,而 null 则表示该变量为空,如
var a; alert(a); // undefined alert(b); // 报错
当一个函数没有返回值时,返回值是undefined,如
function test () { } alert(test()); // undefined
四、Object类
Object类本身很少用,但是如同Java一样,所有对象都继承自Object类,Object类有如下几个重要方法:
1. constructor 获取该对象的类型
var c = ["red", "blue", "green"]; if (c.constructor == Boolean) { console.log("This is Boolean"); } else if (c.constructor == Object) { console.log("This is Object"); } else if (c.constructor == Array) { console.log("This is Array"); } // This is Array
2. prototype 该方法作用在类上面,指向一个类的所有属性,也可以动态为类添加方法或属性
// 定义一个Persion类 function Person(name) { this.name = name; } // 给Person类添加一个setAge方法 Person.prototype.setAge = function (age) { this.age = age; } // 给Persion类添加一个值 Person.prototype.finger = 10; var p = new Person("zhangsan"); p.setAge(25); console.log(p.age); // 25 console.log(p.finger); // 10 console.log(Person.prototype); // age方法,finger属性及Person类本身
3. hasOwnProperty 判断一个对象是否具有某个方法或属性
var obj = new Object(); obj.test = function () { } obj.name = "zhang"; console.log(obj.hasOwnProperty(‘test‘)); // true console.log(obj.hasOwnProperty(‘name‘)); // true console.log(obj.hasOwnProperty(‘age‘)); // false
经测试,通过prototype添加的属性貌似不能用hasOwnProperty判断
4. toString 将对象转为字符串
var colors = ["red", "blue", "yellow"]; console.log(colors.toString()); // red,blue,yellow
五、其他常用运算符
1. instance 用来精准识别一个对象的类型
var c = ["red", "blue", "green"]; console.log(c instanceof Array); // true console.log(typeof c); // Object
typeof具有局限性,很多情况下typeof返回一个Object,这个时候可以用instance判断,与前面的constructor类似
2. delete 可以删除对象的方法或属性
var p = new Object(); p.setName = function (name) { this.name = name; } p.setName("zhang"); delete p.setName; p.setName("li"); // 报错
delete只能删除开发者自定义的方法或属性,不能删除JavaScript的自带方法
3. void 用于对任何返回结果都置为undefined,如
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScriptTest</title> <script> function clickMe() { return "abc"; } </script> </head> <body > <a href="javascript:void(clickMe())">啊啊啊</a> </body> </html>
如果不加void,则点击之后链接会跳转,加上void,点击链接之后什么也不会发生
六、JavaScript函数
(1)函数定义:JavaScript函数非常神奇,最常见的两种函数定义如下
// 写法1 function func1 (arg1, arg2) { console.log("func1"); } // 写法2 var func2 = function (arg1, arg2) { console.log("func2"); }
以上两种函数定义方法略有区别:func1不管是写在前面还是后面,func1在脚本执行的时候会马上定义;而func2类似一个变量,一定要先定义func2,再执行func2(),否则会报错
func1(); function func1 (arg1, arg2, arg3) { console.log("func1"); func3(); return; function func3() { // func3可以透过return定义,因为他只要一执行func1,func3马上被定义 console.log("func3"); } } func2(); var func2 = function (arg1, arg2) { console.log("func2"); } // func1 // func3 // 报错
(2)函数重载:JavaScript函数不能重载(所谓重载,也就是函数名称相同,函数的参数个数或参数类型不同),他会被后面的函数给覆盖
function clickMe() { alert(100); } function clickMe(x) { alert(x); } clickMe(); // undefined
此处clickMe()里面并未传参,但是他执行的不是第一个函数,而是第二个
(3)函数的arguments对象:
JavaScript函数中,有一个特殊的对象arguments,可以通过arguments获取函数的任何一个参数
function func1 (x, y, z) { console.log("x = " + x + ", y = " + y + ", z = " + z); console.log("x = " + arguments[0] + ", y = " + arguments[1] + ", z = " + arguments[2]); } func1(3, 4, 5); // x = 3, y = 4, z = 5 // x = 3, y = 4, z = 5
arguments还可以用来检测函数的参数个数,arguments.length, 虽然func1的定义中是三个参数,但其由于没有重载,实可以传递更多或更少的参数,与其他的编程语言大不相同,JavaScript的自由度如此之大,是不是惊呆了!
(4)Function类
函数的定义方式除了上面介绍的两种,还有一种用类创建实例的方法创建一个函数
var func1 = new Function("arg1", "arg2", "return arg1*arg2"); console.log(func1(3, 4)); // 12
由于是参数和函数体都是字符串的关系,写起来比较困难,读起来也不爽,所以实际上没见过有人用Function类来创建函数的,不过可以用这种写法来说明函数重载的问题
var clickMe = new Function("alert(100)"); var clickMe = new Function("x", "alert(x)"); clickMe(); // undefined
现在知道为什么会执行第二个函数了,第一个函数被重写覆盖了
(5)函数闭包
function add() { function doAdd (x, y) { return x + y; } var s = 0; for (var i = 0; i < arguments.length; i++) { s = doAdd(s, arguments[i]); } return s; } var sum = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); console.log(sum); // 55
doAdd函数就是add函数的一个闭包,他在add函数里面,不受外界影响
七、JavaScript对象
(1)JavaScript对象可以分为3种:
1. 本地对象 JavaScript语法本身提供的对象,如Object,Array,String,Boolean,Number,Date,Function等
2. 内置对象 JavaScript有一个顶层的全局对象,在JavaScript中,实际上不存在独立的函数,所有的函数都必须是某一个对象的方法,如isNAN(),parseIn(),eval()等,我们在使用它们的时候并未写出其具体是那个对象调用的方法,他是属于全局对象的方法;另外还有Math对象,如Math.floor()等
3. 宿主对象 JavaScript运行环境提供的对象,如DOM,BOM等
(2)JavaScript对象的一些常用方法
Array对象:concat(),slice(),push(),pop(),shift(),unshift(),reverse(),splice()
String对象:concat(),slice(),split()
内置对象提供了一个eval() 方法,这是一个解释程序,它可以把一段字符串解释成一段JavaScript代码,如
var str = "function sayHi(s) {alert(s)}"; eval(str); sayHi("hello"); // 弹出 "hello"
再一次见证了JavaScript的灵活和强大!
(3)作用域
与其他的面向对象语言不一样,JavaScript中任何对象的函数或属性都是公共的
(4)关键字this
this总是指向调用该方法的对象
function sepakLanguage() { alert(‘I speak ‘ + this.language); } var obj1 = new Object(); obj1.language = "Chinese"; obj1.sepak = sepakLanguage; obj1.sepak(); // I speak Chinese var obj2 = new Object(); obj2.language = "English"; obj2.sepak = sepakLanguage; obj2.sepak(); // I speak English
以上方法中,sepakLanguage中要引用对象的属性时,必须使用this关键字
未完待续。。。
原文:https://www.cnblogs.com/i-o-s-/p/10959948.html