该篇文章主要是为了梳理一下自己的一些前端基础知识,这里所提出的问题主要来源于《一名【合格】前端工程师的自检清单》,感谢大佬分享🙏🙏🙏。
1、JavaScript规定了几种语言类型
在JS中主要分为两种类型,基本类型和引用类型。基本类型分为六种:String、Number、Boolean、Null、Undefined、Symbol,这些类型都是按值访问,变量直接存放在内存中的。
引用类型只有一种:Object,这种类型的值是按引用访问的,值是保存在堆内存中的对象。
2、Symbol类型在实际开发中的应用、可手动实现一个简单的Symol
在ES5的对象属性名都是字符串,这很容易造成属性名的冲突。例如,使用了一个他人提供的对象,但是又想为这个对象添加新的方法,但是新的方法又可能会与现在的方法同名而产生冲突。Symbol就是为了解决这种问题而开发出来的。
如果Symbol的参数是一个对象,那么就会调用该对象的toString方法,将其转为字符串,然后再生成一个Symbol值
const obj = {
toString: () => 'abc'
}
const sym = Symbol(obj);
sys // Symbol(abc)
Symbol函数的参数只是表示对当前Symbol值的描述,因此相同的参数的Symbol函数的返回值是不想等的
let a = Symbol();
let b = Symbol();
a === b // false
由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,这样能够保证不会出现相同的属性名。
let a = {
text: 'Hello world'
}
const text = Symbol('text')
a[text] = 'Hello JS'
a[text] // 'Hello World'
a.text // 'Hello World'
a['text'] // 'Hello World'
3、JavaScript 中的变量在内存中的具体存储形式
JavaScript 中的变量分为基本类型和引用类型两种。
基本类型是保存在栈内存中的简单数据段,这些变量的值都有固定的大小,保存在栈的空间中,通过按值访问。
引用类型都是保存在堆内存中,值大小都不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript不允许直接访问堆内存中的位置,因此我在操作对象时,都是操作的对象的引用。
4、null和undefined的区别
在js中将一个变量赋值为null或者undefined,几乎没有区别,他们在if条件判断中都会被专为false,甚至使用相等运算符都是直接报二者相等。
undefined == null // true
undefined === null // false
在Javascirpt最初版本是这样去区分二者的:null表示“无”的对象,转化为数值时为0,undefined是一个表示“无”的原始值,转化为数值时为NaN
Number(undefined) // NaN
Number(null) // 0
但是上面这样区分,在实践中是不可取的。当下,null和undefined基本都是同义的,只有一些细微的差别。
null表示“没有对象”,即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2)作为对象原型链的终点。
undefined表示“缺少值”,就是有一个变量本应有一个值,但是没有定义。
(1)变量被声明了,但是没有赋值时,就等于undefined。
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
var a // undefined
function f(x) { console.log(x } // undefined
var o = {}
o.p // undefined
var x = f ()
x // undefined
5、至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型
在JavaScript中七种基本数据类型:Object、Number、String、Boolean、Symbol、undefined、null。
同时我们还会对Object类型进行细分,例如Array、Function、Date、RegExp
我们如何判断这些数据类型在平时的使用中
typeof
typeof可以帮助我们区分除了Null以外的所有的原始数据类型,对象类型的可以从普通类型里面识别出来:
typeof undefined // "undefined"
typeof null // "object"
typeof 1 // "number"
typeof "1" // "string"
typeof Symbol() // "symbol"
typeof function () {} // "function"
typeof {} // "object"
typeof true // "boolean"
typeof也并不是万能的,它无法识别出null的类型以及所以以Object类型为基础构建的数据类型,都会被识别为Object。
instanceof
instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。
3 instanceof Number // false
'3' instanceof String // false
true instanceof Boolean // false
以上的🌰都是因为这些数据都为原始数据类型,并使通过构造函数生成的。
// 定义构造函数
function C () {}
function D () {}
var o = new C()
o instanceof C // true,在Objcet.getPrototypeOf(o) === C.prototype
o instanceof D // false, D.prototype不在o的原型链上
o instanceof Object // true, 因为Object.prototype。isPrototypeOf(o)返回true
Object.prototyoe.toString
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是toString运行时this指向的对象类型,返回的类型格式为[object,type],type表示具体的数据类型:Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有对象的类型都可以通过这个方法获取到等等
const a = {};
Object.prototype.toString(a) // "[object Object]"
6、出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法
0.1 + 0.2 // 0.30000000000000004
上面是一个JavaScript中经常遇到的小数精度丢失问题。《深入理解JavaScript中的精度丢失》