We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
+true // 1 ~~true // 1 +NaN // NaN ~~NaN // 0 +(0) // 0 ~~(0) // 0 +(-1) // -1 ~~(-1) // -1 +Infinity // Infinity ~~Infinity // 0 ~~(-Infinity) // 0 +null // 0 ~~null // 0 +undefined // NaN ~~undefined // 0
var a = 1 delete a // false age = 21 delete age // true
定义 ref 为 一元表达式 评估结果
ReturnIfAbrupt(ref)
如果 ref 不是 Reference 类型,返回 true
如果 IsUnresolvableReference(ref) 为 true,
a. 断言:IsStrictReference(ref) 为 false
b. 返回 true
如果 IsPropertyReference(ref) 为 true,
a. 如果 IsSuperReference(ref) 为 true,抛 ReferenceError 错误
b. 定义 baseObj 为 ! ToObject(GetBase(ref))
c. 定义 deleteStatus 为 ? baseObj.[[Delete]](GetReferencedName(ref))
d. 如果 deleteStatus 为 false 并且 IsStrictReference(ref) 为 true,抛 TypeError 错误
e. 返回 deleteStatus
否则,
a. 断言:ref 是对 环境记录 绑定的 引用
b. 定义 bindings 为 GetBase(ref)
c. 返回 ? bindings.DeleteBinding(GetReferencedName(ref))
注意:当在 严格模式代码 中使用 delete 运算符,如果其 一元表达式 是对一个变量,函数参数,或函数名的直接引用,将会抛出 语法错误。此外,如果在 严格模式代码 中使用 delete 运算符,并且被删除的属性其属性描述符中含有 { [[Configurable]]: false } ,也会抛出 类型错误。
为何要执行一次 GetValue?
规范中的解释:GetValue必须被调用一次即使用不到它的结果,因为可能有明显的副作用
// 浏览器环境 typeof a // undefined // 我压根没有声明a这个变量,但是typeof不会报错,只会返回undefined
定义 val 为 一元表达式 评估结果
如果 val 是 类型,
a. 如果 IsUnresolvableReference 为 true,返回 "undefined"
将 val 设为 ? GetValue(val) 的结果
根据下表返回一个字符串
PS:规范关于BigInt使用typeof结果有误,不过已经修改了,待规范重新编辑,看 typeof 修订
注意!+ 和 ~~ 本质上是不同的,虽然我经常会两个混用来快速转换,但是这两是有明显去别的!!!
注意:规范此处编写有误,不过未来会修改,见 + 运算符修订
一元 - 运算符将其操作数转换为 Number 类型,然后取反。对 +0 使用得到 -0,对 -0 使用得到 +0.
-(-0) // +0 -(+0) // -0
+ 运算符和 ~ 本质是不同的,它们俩内部算法就不同!
表示先对目标进行 按位非运算,再对结果进行一次 按位非,其实是连续进行了两次按位非运算!!!这涉及到二进制运算了。想了解的可以看下二进制,我目前对二进制了解也不算多,还停留在普通的二进制和十进制转换。。。
PS:变量值是对象的话,对象内部属性不受影响
var a = 'a' let b = 'b' const c = 'c' d = 'd' const obj = {o: 'o'} delete a // false delete b // false delete c // false delete d // true delete obj // false delete obj.o // true
[[Configurable]]
// 来自高级前端面试 const name = 'lizz'; function fn() { console.log(typeof name); const name = ''; } fn()
这道题结果是 引用错误,我想差了,选择了 undefined,有点丢脸。我知道 const 会形成暂时性死区,但是我误以为函数 fn 里面的 name 是 IsUnresolvableReference,其实不是的,我搞混了!!!
const
fn
name
The text was updated successfully, but these errors were encountered:
No branches or pull requests
一元运算符
提个问题,看看下面的代码,+和~~区别是什么?
1. delete 运算符
定义 ref 为 一元表达式 评估结果
ReturnIfAbrupt(ref)
如果 ref 不是 Reference 类型,返回 true
如果 IsUnresolvableReference(ref) 为 true,
a. 断言:IsStrictReference(ref) 为 false
b. 返回 true
如果 IsPropertyReference(ref) 为 true,
a. 如果 IsSuperReference(ref) 为 true,抛 ReferenceError 错误
b. 定义 baseObj 为 ! ToObject(GetBase(ref))
c. 定义 deleteStatus 为 ? baseObj.[[Delete]](GetReferencedName(ref))
d. 如果 deleteStatus 为 false 并且 IsStrictReference(ref) 为 true,抛 TypeError 错误
e. 返回 deleteStatus
否则,
a. 断言:ref 是对 环境记录 绑定的 引用
b. 定义 bindings 为 GetBase(ref)
c. 返回 ? bindings.DeleteBinding(GetReferencedName(ref))
2. void 运算符
为何要执行一次 GetValue?
3. typeof 运算符
定义 val 为 一元表达式 评估结果
如果 val 是 类型,
a. 如果 IsUnresolvableReference 为 true,返回 "undefined"
将 val 设为 ? GetValue(val) 的结果
根据下表返回一个字符串
4. 一元 + 运算符
5. 一元 - 运算符
6. 按位非 ~ 运算符
7. 逻辑非 ! 运算符
粗略回答下开头问题
+ 运算符和 ~ 本质是不同的,它们俩内部算法就不同!
表示先对目标进行 按位非运算,再对结果进行一次 按位非,其实是连续进行了两次按位非运算!!!这涉及到二进制运算了。想了解的可以看下二进制,我目前对二进制了解也不算多,还停留在普通的二进制和十进制转换。。。补充:为什么var, let和const声明的变量不能从全局环境中删除?为什么未声明但赋值的变量能删除?
PS:变量值是对象的话,对象内部属性不受影响
[[Configurable]]
赋值!2020-03-14 补充typeof
这道题结果是 引用错误,我想差了,选择了 undefined,有点丢脸。我知道
const
会形成暂时性死区,但是我误以为函数fn
里面的name
是 IsUnresolvableReference,其实不是的,我搞混了!!!The text was updated successfully, but these errors were encountered: