1

一、js的数据类型有基本数据类型和引用类型

基本数据类型包括:undefined, null,boolean,number,string
引用类型是object:包括function,array,Date...

【es6新增类型】
1. set 集合,区别于数组的就是 set中不可以有重复的数据,常可以用来做去重操作

  • 含有size属性,集合里元素的个数
  • add 方法,返回的是原对象改变后的值
  • delete方法,返回值是true/false
  • has('data1') 返回值是true/false
  • myset.keys(); myset.value()

图片描述

2. Map类型,与对象的区别是:对象的键值只能是字符串,不可以是对象类型,使用Map类型可以避免键值必须是字符串的限制,可以是对象,数组等

  • 创建的时候一个大的数组,每一项元素是小数组,小数组有两个元素,分别是一组对应的key,value。
  • 方法:
  • set(key,value); get(key);
  • delete(key); has(key); //返回值均是true/false
  • mymap.forEach(function (value,key) {
    console.log(key+":"+value);
    }) // 遍历,参数是value,key 【注意顺序】
  • mymap.set({},"obj1");
  • mymap.set({},"obj2"); 这是两个不同的键值,不会被覆盖

图片描述

3.Symbol类型 用相同的字符串做属性名命名的时候会发生命名冲突,使用Symbol产生的名字是不同的

  • Symbol 即便传入相同的参数,两者的值也是不一样的 例:Symbol('foo') !== Symbol('foo');
  • 如果想让两者相等,可以使用Symbol.for() 例 Symbol.for('bar') === Symbol.for('bar')
  • 但是 Symbol('bar') !== Symbol.for('bar');
    如果Symbol作为属性名,不会被Object.keys() Object.getOwnPropertyNames()、JSON.stringify()返回;该属性也不会出现在for...in、for...of循环中。但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
    图片描述

typeof null返回值是 “object”,null会被认为是一个空对象的引用
null == undefined //true
当定义一个变量用来保存对象,就可以将这个变量初始化为null

实现继承
function Person(){}
function Student(){}
Student.prototype = new Person()
Student.prototype.constructor= Student
var bosn= new Student()
bosn instanceof Student //true
bosn instanceof Person // true

二、判断类型的方式

typeof | instanceof | Object.prototype.toString.apply()

  1. typeof: 适用于基本类型和function,object具体是数组还是对象识别不了,null也是别不了

    typeof [1,2]   // 'object'
    typeof '123'   //'string'
    typeof null     // 'object'
    typeof undefined  //'undefined'
    typeof function(){}   //'function'
    typeof new Object()  //'object'
  2. instanceof: 适合自定义对象和原生对象,检查prototype

     [1,2] instanceof Array  //true
  3. Object.prototype.toString.apply() 适合基本对象和内置对象,IE6、7、9中null和undefined 失效

图片描述

三、空数组的问题

   [] == false   //true        任意值与布尔值比较,都会将两边的值转化为Number; Number([]) 为0    Number(false)也是0    所以[] == false 为true
   [] ==![]     // true          Number([]) = 0;  Number(![]) = 0 ;   所以 []==![] 为true
   new Array(1) == false;  //true    new Array(1)==> [empty]  ,  Number(new Array(1)) = 0   
   Boolean([])   //true
   if([]){console.log(1)}  //此时[] 是true
   NaN == NaN  // false   
   null == undefined  //true

四、Number强制转换数字

  1. 如果参数是Date对象,Number()会返回从1970年1月1日至今的毫秒数
    图片描述
  2. 如果字符串截去开头和结尾的空白字符后,不是纯数字字符串,那么最终返回结果为NaN。
  3. Number转对象

    1.先调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,返回结果。
    2.如果valueOf返回的还是对象,继续调用对象自身的toString方法。如果toString返回原始类型的值,则对该值使用Number函数,返回结果。
    3.如果toString返回的还是对象,报错。
    

    Number([1]); //1
    转换演变:
    [1].valueOf(); // [1];
    [1].toString(); // '1';
    Number('1'); //1

图片描述


webjing
21 声望0 粉丝