下面仅仅是基础知识,并没有很深入
[TOC]
基础数据类型
Boolean,Number,String,Null,Undefined,Symbol 为原始数据类型
Object 暂时叫做对象吧
tips:typeof----------------------------------------------
查看对象的引用可以使用 typeof 如
var a = {};
typeof a;
a = -1;
typeof a;
a = false;
typeof a;
typeof undefined;
typeof null;
Boolean
只有值 true 和 false
var a = false;
console.log(a) //false
a = a === false
console.log(a) //true
Number
这里的Number最大为64位二进制格式的值,这是为了能够表示浮点数和双精度数和长整型数,一般整数是32位类型,除此之外还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
console.log(0); // 0
console.log(0.1) ;//0.1
console.log(0xfffffffffffff); //4503599627370495
console.log(Number("0")) ;//0
console.log(Number("a")); //Nan
console.log( 1 / 0); //Infinity
console.log( 1 / -0); //-Infinity
console.log( 0xffffffffffffffffff); //4.722366482869645e+21
String
字符串,不可更改,进行字符串操作时,如 'abc' + 'de'
返回的是新的字符串的引用
var a = 'abc';
var b = a;
a = a + 'de';
console.log(a,b);// abcde , abc
Symbol
符号类型,有着唯一性,常用于作为Object 的 key值的存在,由于其唯一性可以使用的场景很多,比如某服务器会话session...
Symbol.for 由于其特殊性会产生全局变量,所以其内存不会被回收,使用不当可能会造成内存泄漏
但是 Symbol(key) 这样子使用就不会产生全局变量,只是这样就不能通过Symbol.for 找到
var a = {};
var b = Symbol("hah"),c = Symbol("hah");
console.log(b == c) // false , symbol有唯一性
a[b] = "symbol test";
console.log(a) //{} , symbol在普通对象是不可见的,
Object.getOwnPropertySymbols(a) //[Symbol(),Symbol(hah)]
var d = Symbol("mykey");
console.log(Symbol.for("mykey") == d ) ;//false ,
var e = Symbol.for('mykey');
console.log(Symbol.for("mykey") == e ) ;//true
Null
只有一个值 null
,但有个地方有点小奇怪 typeof null
返回object
console.log(null == null) //true
console.log(typeof null) //object
Undefined
没有赋值的变量的默认值 为 undefined
var a;
console.log(a);
console.log(typeof a)
Object
简单的理解为 上述基础对象和自身的集合
var a = [];
console.log(typeof a);// object
var a ={ a:1 };
var b = Object.create(a);
console.log(b);// {} Object.create()会复制所有的__proto__,ownPoperty是不是复制的
var c = Object.assign({b:1},a);//{ b: 1, a: 1 } Object.assign会拷贝前一个对象的可枚举(Object.keys)属性到后一个对象里面,并作为新对象返回,(不会修改作为对象参数)
console.log(c,a); //{ b: 1, a: 1 } , { a: 1 }
var d = new function(){this.a =1};
console.log(d); // {a:1} new 可以产生一个对象
类型强转
强转的时候是基础类型用类型名转的 如 Number(true) , String(NaN) , Boolean(-1),返回的是基础类型
Number,String,Boolean 这三个本身就是对象类型 Object(基础类型) 返回的是基础类型的对象类型,
Undefined Null Symbol 不包括在里面
Number -> Other
- String
- 先转10进制 然后再转字符
- NaN 转字符为 NaN
- Infinity 转字符为 Infinity
- 带有负号的转字符负号任然存在,如 String(-Infinity) -> '-Infinity'
- Boolean
- 0 为false
- NaN 为false
- 其他都为true
Boolean -> other
- String
- true -> true,false->false
- Number
- true -> 1 ,false -> 0
String -> other
- Number
- +号和-号 不影响转换,如果为-转换之后保留(-NaN 除外)
- 去掉空白,换行符,制表符 之后的字符串符合组成数字的结构,则转换成对应数字 否则为NaN
- NaN 为NaN , Infinity 为 Infinity
- 去掉空白,换行符,制表符 之后的字符串 如果为 空字符则为 0
- Boolean
- 空字符为false ,其余为true (这个坑很常见)
Object ->other
- Number
- 优先调用obj.valueOf() 没有的话调用obj.toString() 如果有值的话,则对返回值进行强转Number,如果toString或者valueOf 返回值是对象,那么就会报错,这个报错会让程序崩掉
-示例
var a = {} a.toString = function(){return 2}; a.valueOf = function(){return 1}; console.log(Number(a));// 1 a.valueOf = function(){return {} }; console.log(Number(a));//这里就会报错了
- 优先调用obj.valueOf() 没有的话调用obj.toString() 如果有值的话,则对返回值进行强转Number,如果toString或者valueOf 返回值是对象,那么就会报错,这个报错会让程序崩掉
- String
- 调用obj.toString 方法,如果没有对toString修改,则默认返回 [object Object]
- Boolean
- 所有的object都为true(null 算作 Null 类型)
主要参考文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures