var :函数做用域数组
var定义的变量做用域为包含它函数的局部变量,改变量在函数退出时被销毁。(因此在函数内部用var定义的变量在函数外部是访问不到的)markdown
let和const:块级做用域函数
let和const定义的变量做用域为包含它的代码块。ui
typeof 检测值 | 返回值 |
---|---|
未初始化、未声明变量 | undefined |
boolean | boolean |
string | string |
number | number |
object、null | object |
function | object |
symbol | symbol |
typeof
原理:this
js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息👉spa
000:对象prototype
010:浮点数code
100:字符串orm
110:布尔对象
1:整数
but, 对于 undefined 和 null 来讲,这两个值的信息存储是有点特殊的。
null:全部机器码均为0
undefined:用 −2^30 整数来表示
因此,typeof 在判断 null 的时候就出现问题了,因为 null 的全部机器码均为0,所以直接被当作了对象来看待。
每一个 JavaScript 对象均有一个隐式的 proto 原型属性,而显式的原型属性是 prototype。instanceof
原理就是先拿到右边的prototype属性,在依次检查左边原型链上的__prop__属性,直到有相等的就返回true
,直到null还未找到就返回false
。
将非数值转换为数值:
Number()、ParseInt()、ParseFloat()
ParseInt()转换规则: 从第一个非空格字符开始转换
,若是第一个转换的字符不是数值、+、-
则返回naN
,直至字符串末尾,因此空字符串也会返回naN。
ParseFloat()转换规则: 从第一个非空格字符开始转换
,若是第一个转换的字符不是数值、+、-
则返回naN
,直至字符串末尾,因此空字符串也会返回naN,只有第一个小数点是有效的后面的都会忽略。
函数 | 参数 | 参数-->返回值 | true/false | 数值 | null | undefined | 字符串含数值 | 字符串含数值和+、- | 字符串含浮点数 | 字符串含十六进制数 | 空字符串 | 字符串前面的都不含 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Number() | 任何数据类型 | 1/0 | 直接返回 | 0 | naN | 十进制数 | 十进制数 | 浮点数 | 十六进制数 | 0 | naN | |
ParseFloat() | 字符串 | 1/0 | 直接返回 | 0 | naN | 十进制数 | 十进制数 | 浮点数 | 十六进制数 | 0 | naN | |
### 隐式转换 |
换为字符串:
toString():null和undefined除外,每一个值都有toString()属性。
string()转型函数:null和undefined返回"null"和"undefined",其余值调用toString()。
用+给一个值加上一个" "
for in 和 for of 的异同点
比较 | for..in | for..of |
---|---|---|
不一样点 | 能够遍历普通对象 遍历出数组的原型对象 能够遍历出数组自身属性 遍历出来的值是 key 不能够遍历 map/set 不能够迭代 generators IE 支持 |
不能遍历普通对象 不会遍历出原型对象 不会遍历自身属性 遍历出来的值是 value 能够遍历 map/set 能够迭代generators IE 不支持 |
相同点 | 能够遍历数组 能够 break 中断遍历 |
能够遍历数组 能够 break 中断遍历 |
function myInstanceof (left, right) {
const RigPro = right.prototype
while (true) {
if (left === null) {
return false
}
if (left.__proto__ === RigPro) {
return true
}
left = left.__proto__
}
}
复制代码
new关键字作了什么:
1.在内存中建立一个新对象
2.将这个新对象内部的__proto__
属性赋值为构造函数的prototype属性。
3.构造函数的内部的this被赋值为这个新对象(即this指向新对象)
4.执行构造函数内部的代码(给新对象添加属性)
5.若是构造函数返回非空对象,则返回该对象;不然,返回刚建立的新对象。
function myNew (func, ...args) {
// myNew函数接收两个参数:构造函数,构造函数所须要的参数
const newObj = {}
newObj.__proto__ = func.prototype
const obj = func.call(newObj, ...args)
if( ( typeof obj == 'object' || typeof obj == 'function' )&& typeof obj !== 'null' ) {
return obj
}
return newObj
}
function Person(name, age) {
this.name = name
this.age = age
}
const p1 = myNew(Person, 'lili', 18)
console.log(p1);
复制代码
Object.prototype.myCall = function (context, ...args) {
// 当context为null或undefined时,将context赋值为window
context = context || window
// 新建一个fn属性,用来保存当前调用这个函数的this
context.fn = this
const result = context.fn(...args)
delete context.fn
return result
}
const p1 = {
add: function add (a, b) {
return a + b
}
}
console.log(p1.add.myCall(p1, 1, 2));
复制代码