数据类型
null, undefined
- null 是空值,即初始时表示值为空,之后再赋值
- undefined 是 未定义
1 2 3 4 5
| null + 4 {} + 4 undefined + 4 [] + 4 "" + 4
|
布尔值
- 基础数据类型自动转换为
false
:1 2 3 4 5 6
| 0 NaN "" false undefined null
|
- 空数组和对象:
true
数值
- NaN不等于任何值:
NaN !== NaN
0/0 // NaN
- Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)
0 * Infinity // NaN
Number()
1 2 3 4 5
| Number([]) Number([123]) Number({}) Number(null) Number(undefined)
|
parseInt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| parseInt('+') parseInt('+1') parseInt('0x10') parseInt('011')
parseInt(0.0000008) parseInt('8e-7')
parseInt('10', 37) parseInt('10', 1)
parseInt('10', 0) parseInt('10', null)
parseInt(0x11, 2) parseInt(011, 2)
parseInt(String(0x11), 2) parseInt(String(011), 2)
parseInt('17', 2) parseInt('9', 2)
|
isNaN()
1 2 3 4 5 6 7 8 9
| isNaN("123")
isNaN([]) isNaN([123]) isNaN(['123']) isNaN(Number({})) isNaN(Number(['xzy']))
|
对象
属性
- 所有键名(key/也称为属性property或方法) 都是字符串(也有Symbol), 所以加不加引号都行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| var obj = { 1: "a", 3.3: "b", <!-- 不符合标识名的条件 --> "1p": "必须加引号" }
obj[1] == "a" obj["1"] == "a" ```
- 变量指向对象,是指向了一个内存地址。 - 不同的变量名指向同一个对象,那么它们都是这个对象的引用 - 取消某一个变量对于原对象的引用,不会影响到另一个变量 - 点运算符:直接表示字符串属性,不需加引号。 > ※ 数字属性不能用点运算符 - 方括号运算符: 需要加引号,否则识别成一个变量 > `obj["foo"] !== obj[foo]` - 删除属性:`delete obj.p > 无法删除继承的属性 > 只有`configurable: false` 时,返回false
#### 判断是否为自身属性 - `obj.hasOwnProperty('toString')) // false` - `'toString' in obj // true` - `for (var p in obj)` > 遍历可遍历(enumerable)的属性,跳过不可遍历的属性 > 自身的和继承的都显示
## 函数 ### 函数定义 - 采用**function命令**声明函数会提升。**赋值语句**定义函数不会 - 具名函数只能在函数内部调用, 赋值后就没有意义 - `name` 属性会返回具名函数 `function`字段后的名称 ```js var f3 = function myName() {}; f3.name
|
函数的作用域
参数
- 传入基础类型是值传递, 不会改变全局的值
- 传入对象是地址传递,更改形参的属性,实参的属性也会变。
如果替换掉整个参数,这时不会影响到原始值
∵ 将形参指向了另一个地址,故不会改变原地址的内容
同名参数
- 取最后出现的那个值。
1 2 3 4
| function f(a, a) { console.log(a); } f(1)
|
arguments
callee
闭包
1 2 3 4 5 6 7 8
| function f1() { var n = 999; function f2() { console.log(n); } return f2; } f1()();
|
- 闭包就是函数f2: 能够读取其他函数内部变量的函数
- 其两大特点:
- 可以读取函数内部的变量另一个就是
- 让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在
- 封装对象的私有属性和私有方法
数组
不推荐用 for in
空位 和 undefined 区别
delete
删除某位后形成空位, 对 length
没有影响: [,,,]
- 空位都会被跳过:
forEach
方法、for...in
结构、以及Object.keys
方法进行遍历
undefined
不会跳过: [undefined,undefined,undefined]
运算符:相加
布尔值
- 布尔值转换为数值
- 俩布尔值相加
- 布尔值 和 数值相加
字符串
1 2
| '3' + 4 + 5 3 + 4 + '5'
|
对象
- 必须先转成原始类型的值,然后再相加:
obj + 2 // "[object Object]2"
是因为调用了 valueOf
得到对象本身,再调用toString
得到 [object Object]
特例:如果运算子是一个Date
对象的实例,那么会优先执行toString
方法
其余运算符 - * /
数据类型转换
Number 同上
null
转为数值时为0
,而undefined
转为数值时为NaN
String
基础类型
对象
1 2
| String({a: 1}) String([1, 2, 3])
|
自动转化
- 先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串
1 2 3
| '5' + {} '5' + [] '5' + function (){}
|
Boolean
1 2 3 4 5 6 7 8 9 10 11 12
| false undefined null 0 NaN ''
[] {} Boolean(new Boolean(false))
|
Error
new Error(message)
配合name 和 stack使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function f() { try { throw '出错了!'; } catch(e) { console.log('捕捉到内部错误'); throw e; } finally { return false; } } try { f(); } catch(e) { console.log('caught outer "bogus"'); }
|
Object 对象
- Object对象本身的方法: 被Object直接使用
Object.print()
- Object的实例方法: 定义在Object原型对象
Object.prototype
上的方法, 被Object的实例直接使用 var obj = new Object(); obj.print()
- obj 是一个实例,继承了
Object.prototype
的属性和方法
Object()
函数
- 保证其是Object
- null/undefined: 返回空对象
- 数/字符串/boolean:
obj instanceof Object // true
+ obj instanceof Number // true
- 对象/数组/函数:不转换,返回原对象/数组/函数
- 区别于
new Object()
构造函数
Object 静态方法
Object.keys
和 Object.getOwnPropertyNames
Object.keys
方法返回自身的(而不是继承的)所有属性名,只返回可枚举的属性。
Object.getOwnPropertyNames
返回对象自身的所有属性名,还返回不可枚举的,例如:length
Object 实例方法
Object.prototype.valueOf()
Object.prototype.toString()
等
obj.hasOwnProperty
- 实例对象自身是否具有该属性。
toString // false
判断类型
Object.prototype.toString.call(value)
:
- 函数:返回
"[object Function]"
- 数值:返回
"[object Number]"
- Error 对象:返回
"[object Error]"
- RegExp 对象:返回
"[object RegExp]"
- 其他对象:返回
"[object Object]"
数组
- 一般不用
new Array()
语法,有歧义1 2 3 4 5 6 7
| new Array(1) new Array(2)
new Array(1, 2) new Array('a', 'b', 'c')
|
静态方法
Array.isArray()
: 弥补 typeof 的不足
包装对象
new Number()
new String()
new Boolean()
生成的是对象,与原数字/字符串/布尔值 不相等
Date对象
普通函数用法
构造函数
1 2 3 4 5 6 7 8 9 10 11 12
| new Date(1378218728000)
new Date('January 6, 2013');
new Date(2013, 0, 1, 0, 0, 0, 0)
|
面向对象编程
new 命令
- 原理:
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的prototype属性。
- 将这个空对象赋值给函数内部的this关键字。
- 开始执行构造函数内部的代码。
Object.create()
- 创建实例对象: 在没有构造函数的情况下,利用现有的对象生成新的实例对象