本篇文章给大家带来的内容是关于JavaScript基础数据的梳理,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
本篇文章给大家带来的内容是关于JavaScript基础数据的梳理,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 看了一些资料,结合ES6、高程和MDN,对JS核心知识点进行了梳理。由于篇幅有限,这里只对我认为重要的知识做了介绍。一些常识性的东西可以参考高程,另外一些核心知识点的扩展可以参考我其他的文章。本文适合作JS知识点复习/突击用,亦可作为前端面试指导。 7种数据类型基础数据类型:存储到栈内存中,操作的是值 null:空指针,所以typeof null ==>Object undefined:定义了未赋值 Number:数字 String:字符串 Symbol:一种实例是唯一且不可改变的数据类型。 Boolean:布尔值 引用数据类型:储存在堆内存种,操作的是空间地址 Object:具体可以是Array,Function,RegExp,Date 判断数据类型(方法,优劣)typeof:只能判断基础类型中的非Null,不能判断引用数据类型(因为全部为object) typeof '' // ==> string typeof 1 //==> number typeof true //==>boolean typeof undefined //==>undefined let b = Symbol() ; typeof b //==>symbol -----------------下面的判断不了实际类型了----------------------- typeof function fn(){} //==>function typeof null //==>object typeof [1,2,3] //==>object typeof {} //==>object instanceof:用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置,可以用它来判断Array但是不够优雅且有一定风险 let arr = [1,2,3] arr instanceof Array //==>true arr instanceof Object //==>true instanceof操作符的问题在于,它只有一个全局执行环境,如果网页有多个框架,那实际上就存在两个以上的不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果从一个框架想另外一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具备各自不同的构造函数 ----高程page88 (笔者白话问翻译一下: constructor:原理也是基于原型链,风险同样来之于原型链的重写,比如当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效! isNaN: console.log(isNaN("1px")); //先调用Number('1px'),返回NaN,然后再调用isNaN(NaN)返回true //燃鹅 '1px'客观并不是NaN [1,2,3,1].constructor === Array; // true -----------------------------------------------比较好的方法-------------------------------- Object.prototype.toString.call() Object.prototype.toString.call(null) // ==> [object Null] Object.prototype.toString.call([]) // ==> [object Array] -------------------------------------------------优雅的方法--------------------- 如果需要单独判断Array Array.isArray([]) //==>true 如果需要单独判断null let a = null Object.is(a , null) //==>true 6种声明变量的方法ES5 只有两种声明变量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。 --es6 var:变量提升,没有块级作用域说到var肯定要提变量提升:当前作用域,js(函数)执行前,浏览器会把带var或者function进行提前声明和定义
const: 常量,地址不变,但是属性可以变let: 块作用域,暂时性死区(TDZ),不进行变量提升,不允许重复声明//只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。所以下面代码不报错,外层作用域和里层作用域都有一个tmp let tmp = 123; if (true) { let tmp =123; } //ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 let tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } import:es6模块化解决方案class:es6继承解决方案类型转化这一块内容太多,太杂了,其实我不怎么想写,因为很少有人会这么写代码。但是这块太重要了,面试必考。建议大家掌握这块的核心内容以及原则,不要关注奇淫巧技。 1.自动装包三种包装类型:Number,Boolean,String let s1 = '123' let s2 = s1.slice(2) // a是基本类型,它是没有slice方法的这里实际上后台完成了一个自动装包 ---下面是实际发生的事--------- let s1 = new string('123') let s2 = s1.slice(2) s1 = null //注意这里用完就销毁了 //所以如果添加某个属性后面是调用不出来的 let s1 = '123' s1.color = 'red' console.log(s1.color) // ==> undefind
2.强行转化为数字
console.log(Number({}));//NaN console.log(Number(null));// 0 console.log(Number(undefined));// NaN console.log(Number([]));// 0 console.log(Number(""));// 0 console.log(Number(true));// 1 console.log(Number(false));
console.log(parseInt("12px12"));// 12 console.log(parseInt("12.666.777px12"));// 12 console.log(parseInt("px12.666px12"));// NaN console.log(parseInt(""));// NaN console.log(parseInt(true));// NaN console.log(parseInt({}));// NaN console.log(parseInt([]));// NaN console.log(parseInt(null));// NaN console.log(parseInt(undefined));// NaN
console.log(Number("1px")); //==> NAN console.log(parseInt("1px")); //==> 1 console.log(parseInt("p1px")); //==> NaN 3.-转化会先把字符串转换成数字( console.log("6" - 2);//==> 4 console.log("5px"-"4")//==> NaN (NaN-4还是NaN)
|