JavaScript基础
看到最近很火的这个文章,所以该整理下吗?
变量和类型
-
JavaScript规定了几种语言类型?
分为引用类型(堆区)和初始类型(栈区)
引用类型:
Object
初始类型:
number
、string
、boolean
、null
、undefined
、Symbol(独一无二的值,es6)
-
JavaScript对象的底层结构是什么
任何一个对象都有
__proto__
这个属性,只有函数对象有
prototype
这个属性,在Js,一切皆对象实例化对象的时候会做3件事
1 先创建一个空的对象 nullobj={}
2 获得指向 obj.proto=Animal.prototype 将
__proto__
指向构造函数的prototype3 完成对象的初始化
-
Symbol
类型在实际开发中的应用、可手动实现一个简单的Symbol3.1
Symbol
值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol
类型。凡是属性名属于Symbol
类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。3.2
Symbol
函数前不能使用new命令,否则会报错。3.3
Symbol
函数可以接受一个字符串作为参数,表示对Symbol
实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。无参数 var s1 = Symbol(); var s2 = Symbol(); s1 === s2 // false 有参数 var s3 = Symbol('s3') var s4 = Symbol('s4')
3.4
Symbol
值不能与其他类型的值进行运算,会报错。3.5 作为属性名的Symbol
let mySymbol = Symbol(); // 第一种写法 let a = {}; a[mySymbol] = 'Hello!'; // 第二种写法 let a = { [mySymbol]: 'Hello!' }; // 第三种写法 let a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上写法都得到同样结果 a[mySymbol] // "Hello!"
3.6 消除魔术字符串
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。 ...
更多可以看es6语法 es6
-
JavaScript
中的变量在内存中的具体存储形式javascript
在内存中分为栈区和堆区,栈区是有序的,先进后出,堆是无序的,里面存放的数据通过指针获取。栈的存取速度大于堆。 基础数据存储在栈区,引用类型数据存放在堆区,比如Object在堆区var a = {a:15,b:20} var b = a b.a = 30 alert(a.a) // 30
-
基本类型对应的内置对象,以及他们之间的装箱拆箱操作
基本类型中的内置对象有
String()
、Number()
、Boolean()
、symbol()
引用类型的有
RegExp()
、Date()
、Error()
、Array()
、Function()
、Object()
基本类型的装箱拆箱操作:
装箱转换
是指将一个值类型隐式
地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。拆箱转换
是指将一个对象类型显式
地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。强制转换:
Number()
强制转为数值型 、String()
强制转为字符串Boolean()
、parseInt()
、parseFloat()
隐式转换:- 算数运算符都是隐式调用number函数进行转换
- 比较运算符结果一定是boolean类型值,比较运算符调用number,如果转化不了,返回false
- 特殊 null==undefined为真
- 逻辑运算符的与和或的结果不一定是boolean类型值,判断结果为判断的值 eg:console.log(0&&123);先判断为假,故输出为0 console.log("123"&&"234");先判断前面为真的时候,再判断后面的结果,判断值为234
-
理解值类型和引用类型
-
null
和undefined
的区别相似处:都属于false
null表示"没有对象",即该处不应该有值
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
不同点:
null
用法:- 作为函数的参数,表示该函数的参数不是对象
- 作为对象原型链的终点。
undefined
用法:- 变量被声明了,但没有赋值时,就等于undefined。
- 调用函数时,应该提供的参数没有提供,该参数等于undefined。
- 对象没有赋值的属性,该属性的值为undefined。
- 函数没有返回值时,默认返回undefined。
-
至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型
var a = "iamstring."; var b = 222; var c= [1,2,3]; var d = new Date(); var e = function(){alert(111);};
8.1 常见:
typeof
alert(typeof a) ------------> string alert(typeof b) ------------> number alert(typeof c) ------------> object alert(typeof d) ------------> object alert(typeof e) ------------> function
typeof
返回类型都是字符串形式,且无法细分判断数组和内置对象如:Date、Array返回的都是Object8.2 已知数据类型的判断
instanceof
alert(c instanceof Array) ---------------> true alert(d instanceof Date) ---------------> false alert(f instanceof Function) ------------> true alert(f instanceof function) ------------> false 注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
8.3 根据对象的
constructor
判断alert(c.constructor === Array) ----------> true alert(d.constructor === Date) -----------> true alert(e.constructor === Function) -------> true 注意: constructor 在类继承时会出错
8.4 通用但很繁琐的方法:
prototype
alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true; alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true; alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true; alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true; alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true; alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;
-
可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用
同 5
-
出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法