ES有7种语言类型:
- Undefined
- Null
- String
- Number
- Boolean
- Symbol(es6)
- Object
1-6为值类型,7为引用类型
# 1.undefined
# 2.null
undefined是变量,不是关键字
let undefined=1
let a=undefined
let b=void 0 //通常用void 0代替undefined
console.log(a) //输出1,
let null=1 //是不允许的,null是关键字
1
2
3
4
5
6
7
2
3
4
5
6
7
# 3.String
String 有最大长度是 2^53 - 1
\uxxxx形式表示一个字符
let a="\u0061" //16位,
console.log(a) //输出a
JavaScript 字符串把每个 UTF16 单元当作一个字符来处理
1
2
3
4
5
6
2
3
4
5
6
# 4.Number
- NAN 非数值
- -Infinity 负无穷大
- Infinity 正无穷大
- js中有+0和-0
Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff
//判断是+0还是-0
console.log(1/-0===-Infinity)
//浮点数判断
console.log( 0.1 + 0.2 == 0.3) //false
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); //true
1
2
3
4
5
2
3
4
5
# 5.Boolean
# 6.Symbol
//创建
var mySymbol = Symbol("my symbol");
//for的语法糖
var o = new Object
o[Symbol.iterator] = function () {
var v = 0
return {
next: function () {
return { value: v++, done: v > 10 }
}
}
};
for (var v of o)
{
console.log(v); // 0 1 2 3 ... 9
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 7.Object
- Object 是 JavaScript 中最复杂的类型。
- 对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key 可以是字符串或者 Symbol 类型。
- C++ 和 Java,每个类都是一个类型。JavaScript中的“类”仅仅是运行时对象的一个私有属性,而 JavaScript 中是无法自定义类型的。
let a=1 //Number类型
let b=new Number(1) //object类型
1
2
2
# 8.类型转换
== 会跨类型转换,建议用===

stringtoNumber
1.使用Number
let a=["30","0b111","0o13","0xff"]
for(let b of a)
{
console.log(Number(b))
}
//结果30,7,11,255
也支持1e3,1e-2科学计数法
2.使用parseInt,只支持原字符和0x开头
let a=["30","0b111","0o13","0xff"]
for(let b of a)
{
console.log(parseInt(b))
}
//结果30,0,0,255
3.只支持原字符
let a=["30","0b111","0o13","0xff"]
for(let b of a)
{
console.log(parseFloat(b))
}
//结果30,0,0,0
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 装箱转换
每一种基本类型 Number、String、BooleanSymbol 在对象中都有对应的类,所谓装箱转换,正是把基本类型转换为对应的对象,它是类型转换中一种相当重要的种类。
Symbol无法new,但也可以转换为对象
1.call强制转换
var symbolObject = (function () { return this; }).call(Symbol("a"));
console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
2.Object转换
var symbolObject = Object(Symbol("a"));
console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
3.装箱对象皆有私有的 Class 属性,Object.prototype.toString 获取:
var symbolObject = Object(Symbol("a"));
console.log(Object.prototype.toString.call(symbolObject)); //[object Symbol]
可以使用typeof做对比
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(typeof null);//object
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拆箱转换
1.Number
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o * 2
// valueOf
// toString
// TypeError
2.String
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
String(o)
// toString
// valueOf
// TypeError
3.es6之后
var o = {
valueOf : () => {console.log("valueOf"); return {}},
toString : () => {console.log("toString"); return {}}
}
o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}
console.log(o + "")
// toPrimitive
// hello
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
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
# 运行时类型
| 示例 | typeof | 运行时类型 |
|---|---|---|
| null | object | Null |
| {} | object | Object |
| (function(){}) | function | Object |
| 3 | number | Number |
| "ok" | string | String |
| true | boolean | Boolean |
| void 0 | undefined | Undefined |
| Symbol("a") | symbol | Symbol |
object——Null 和 function——Object是特例