Skip to content

doubleyao5753/Personal-Tests-Collection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

Personal-Tests-Collection

道阻且长,弄懂一个是一个

题源

知识点

分类

待补充

Get Start

1. 打印输出什么?

function sayHi () {
    console.log(name)
    console.log(age)
    var name = 'xiaoqiang'
    let age = 21
}
sayHi()
  • A: Lydiaundefined
  • B: LydiaReferenceError
  • C: ReferenceError21
  • D: undefinedReferenceError
答案 选择:D

笔点:let与var的区别

解析:

输出name为undefined:对于用var声明的变量name,在其声明之前使用输出 未定义(undefined),相当于在打印时先var namename = 'xiaoqiang'

输出age为ReferenceError:对于用let声明的变量age,在其声明之前使用,输出 引用错误(ReferenceError),代表当一个不存在的变量被引用时报的错误。在ES6中明确规定变量必须声明后再使用,一切在声明前使用的变量都会报此错误

笔记

var:有变量提升(内存空间在创建阶段就被设置好了,直到程序运行到定义变量位置之前默认值都是 undefined。)

let:也有变量提升,和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。

再次注意:1.let,const 有变量提升 2.let,const的变量提升标注了暂时性死区的开始 3.你在暂时性死区里使用,就会报错

---

2. 弹出true还是false?

[] == ![] ? alert(true):alert(false)
答案 结果:true

笔点:类型转换(隐式类型转换)

解析:

1. 取非!的优先级比==高, ![] => !true => false

2. 等号左边是引用类型 [] => [].toPrimitive()=''

3. '' == false => Number('') == Number(false)

4. 0 == 0 => true

笔记

简单来说: 在 == 符号的左右,遇到布尔类型、字符串类型和数字类型这三种基本类型,通通会`Number(x)`将其转为数字;若有一边是引用类型有一边是基本类型,则将引用类型`ToPromitive(x)`后再与另一边的数字类型做比较;若都是引用类型则看他们的指针是否指向同一个对象,是则true;(你需要弄懂ToPrimitive()的执行原理)

注意事项: 时刻牢记,只有`null undefined 空字符串 NaN 0 `会被转换为false,其他的都将转为true;null与undefined不严格相等;NaN与谁都不想等包括自身;null转数字为0,而undefined转数字为NaN

取经: >== 如何工作的?&&&>各种蛋疼的类型转换


About

道阻且长,弄懂一个是一个

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages