JS基础变量、数据类型

1.语言基础

变量,类型,声明。

数组,对象,集合,hash

while if else switch do...while for forEach

< > <= + - | & || &&

JS的基础类型判断

JS有哪些内置数据类型?

7种

- number

- string

- boolean

- null 

- undefined

- symbol

- object

number,string,boolean,null,undefined 为基本类型;

object 包含 function,array,date等。

如何做类型判断?

typeof

console.log(typeof 5)// number

console.log(typeof undefined)// undefined

console.log(typeof 'wzj')// string

console.log(typeof true)// boolean

console.log(typeof Symbol())//symbol 

console.log(typeof {})// object

console.log(typeof null)// object

console.log(typeof [])// object

console.log(typeof (()=>{}))// function

console.log(typeof new Date())// object

总结:

- typeof 会把 null 判断成 object

- typeof 可以判断除了 null 以外的基本类型;

- typeof 对于非基本类型,只能判断出 symbol,function,其他都是object;

数组也会判断成object。

instanceof 判断

使用 a instanceof b 判断,实际上是看 a 的原型链上是否存在 b 的构造函数。

JS

function Person(name){

    this.name = name;

}

const p = new Person('wzj');

console.log(p instanceof Person);//true

但是基本类型不能这样处理。console.log(10 instanceof Number) //false

console.log(new Number(10) instanceof Number)//true

手写实现一个instanceof

const myInstanceof = (left,Right) => {

    if(typeof left !== 'object'){

    return false

}

while(true){

    if(left === null){

        return false

    }

    if(Right.prototype === left._protp_){

        return true

    }

    left = left._proto_;

    }

}

Object.prototype.toString 判断,万能方法

JS

console.log(Object.prototype.toString.call(1)); //[object Number]

console.log(Object.prototype.toString.call('wzj')); //[object String]

console.log(Object.prototype.toString.call(undefined)); //[object undefined]

console.log(Object.prototype.toString.call(true)); //[object Boolean]

console.log(Object.prototype.toString.call({})); //[object Object]

console.log(Object.prototype.toString.call([])); //[object Array]

console.log(Object.prototype.toString.call(function(){})); //[object Function]

console.log(Object.prototype.toString.call(null)); //[object Null]

console.log(Object.prototype.toString.call(Symbol('wzj'))); //[object Symbol]

JS类型转换

为什么会有隐式转换, JS 本身是一种弱类型语言,我们不用提前声明好类型,程序运行时,类型会自动分配。

console.log(1 + 1);//2

console.log(1 + '1');// '11'

console.log(1 + undefined);// NaN

console.log(1 + null);//1

console.log(1 + true);//2

console.log(1 + false);//1

console.log(1 + '');//'1'

console.log(1 + []);// '1'

console.log(1 + 'wzj');// '1wzj'

总结:

- 当使用 + 运算符计算string和其他类型时,都会转换为 string 类型。(另外的值转成字符串)

- 除以上情况外,会转成number 类型,但是 undefined 会转成 NaN,结果也是 NaN

- 当 + 号两边存在NaN,则结果为NaN(not a number)

- Infinity + Infinity  为 Infinity ,Infinity + -Infinity  为NaN

- 如果 string 相加,直接拼接

- 如果 + 号两边,有一个是对象,则调用 valueof() 或 toString()

- 其他情况都会转换成 number类型

对象在进行转换基本类型时,会调用对象上的valueof() 或 toString() 方法,该方法的返回值为基本类型的结果。内置有一个函数 toPrimitive.

console.log(typeof NaN) // number

如何得到一个NaN

console.log(0/0) //NaN

console.log(Infinity + (-Infinity)) //NaN

console.log(Infinity -Infinity) //NaN

console.log(Infinity/ -Infinity) //NaN

console.log(Infinity + Infinity) //Infinity 

网红题

can (a == 1 && a == 2 && a == 3) ever evalute to true ?

(a == 1 &&  a == 2 && a == 3)怎么能让以上为true?

答:

const a = {

    value:1,

    toString:function(){

        return a.value ++ 

    }

}

console.log((a==1 && a == 2 && a == 3)

另一种解法

let value = 0;

Object.defineProperty(global,'a',{

    get:function(){

        return ++value

    }

})

JS的引用与拷贝

基本数据类型,保存在栈中(占用空间小,大小固定,频繁使用);

其他Array,Object,Function都是 引用数据类型(占用空间大,大小不固定 )

JavaScript是有基本数据类型与引用数据类型之分的。对于基本数据类型:number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值。而Object对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。

Object.assign()

const foo = { a : 1}

const bar = { a: 10,b:20}

console.log(Object.assign({},bar,foo)) // {a:1,b:20}

特点:

1.值拷贝

2.返回值为第一个参数

3.浅层 merge

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容