js变量类型[Boolean,Number,String,Undefined,Null,Symbol,Object]

下面仅仅是基础知识,并没有很深入

[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位二进制格式的值(-(2^{63} -1) 到 2^{63} -1),这是为了能够表示浮点数和双精度数和长整型数,一般整数是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));//这里就会报错了
    
  • String
    • 调用obj.toString 方法,如果没有对toString修改,则默认返回 [object Object]
  • Boolean
    • 所有的object都为true(null 算作 Null 类型)

主要参考文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

下一篇文章

js'==' 判断相等时类型强转规则
说说对象那些事儿,(属性行为,原型链)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容