语言基础
-
JavaScript区分大小写,且标识符的规则如下:
- 第一个字符必须是一个字母、下划线或美元符号$
- 剩下的可以为字符、下划线、数字或$,其中的字母可以是Unicode中的字符,如À 和 Æ
- 标识符按照惯例需要使用驼峰大小写
-
注释单行为//,多行为/**/
-
严格模式是一种不同的Javascript解析执行模型,某些不规范写法会在该模式下被处理,需要在想使用的地方添加"use strict",3.1.4
-
语句后添加分号有助于提升性能,在删除空行压缩代码时可以起作用
-
ECMAScript变量是松散类型的,变量可以用于保存任何类型的数据
-
var 不初始化情况下会保存undefined,且可以随时修改变量的类型
-
var操作符定义的变量会称为包含它的函数的局部变量,即在函数内部定义
-
在函数内部定义变量省略var操作符,可以创建一个全局变量
-
var声明提升
function foo(){ console.log(age) var age = 26 } foo() //undefined //不会报错是因为运行默认为 function foo(){ var age console.log(age) age = 26 }
所谓的"提升",即将所有变量声明都拉到函数作用域的顶部,且反复使用var声明同一个变量也没有问题
-
-
let let的所用域是块作用域,var是函数作用域
-
let不允许在同一个块作用域内出现冗余声明
-
暂时性死区 let声明的变量不会在作用域中被提升,在let声明之前的执行瞬间被称为暂时性死区,在此阶段引用之后才声明的变量都将抛出ReferenceError
-
全局声明 let在全局作用域中声明的变量不会成为window对象的属性
var name = 'aaa' console.log(window.name) //'aaa' let age = 14 console.log(window.age) //undefined
-
条件声明 js引擎自动将多余的声明在作用域顶部合并为一个声明,由于let的作用域是块,因此不可能检查之前是否已经使用过let声明同名变量
-
-
var与let的for循环
-
当程序中存在异步操作
for(var i = 0;i<5;i++){ console.log('i:',i); } for(var j=0;j<5;j++){ setTimeout(()=>{console.log('j:',j)},0) } /** * i: 0 * i: 1 * i: 2 * i: 3 * i: 4 * j: 5 * j: 5 * j: 5 * j: 5 * j: 5 */ // 如果是let则两程序的结果相同 /* for循环是同步的,内部事件处理函数是异步的,即等到异步事件触发的时候,同步代码已经跑完,因此i是最大值 let处理的核心思想就是在跑完前就记录i的值,用于异步事件处理函数使用,js引擎会在后台为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例 */
-
const 在声明变量时必须同时初始化变量,且尝试修改时会导致运行时错误,其与let基本相同
-
-
-
数据类型,即原始类型:undefined、null、Boolean、Number、String以及Symbol,以及一种复杂数据类型为Object,Object时一种无序名值对的集合
- 调用 typeof null 返回的是object,实际上是因为底层内存表示的问题,具体可以参考杂项
- 具体参考3.4.2
- isNaN() Number() parseInt() parseFloat() String() toString()
- 模板字面量 3.4.6.4
- 常用内置符号 3.4.7.4
-
全等以及不全等=== !==
-
等于记忆不等于== !=