Day 2
语法基础
1.0语法
JS里区分一切大小写,所有标识符都要遵循首字符必须是字母或者下划线或者$。按照惯例采用驼峰命名法;
所有语句以分号结尾,省略分号意味着由解析器自行决定,
1.1变量
「声明方法」
「var」 :可以在所有版本中使用;使用 var 操作符定义的变量会成为包含它的 函数的局部变量。比如,使用 var 在一个函数内部定义一个变 量,就意味着该变量将在函数退出时被销毁:
function test() { var message = "hi"; // 局部变量 } test(); console.log(message); // 出错!
这里message在调用过后销毁了,所以错误,函数内省略var,可以创造一个全局变量,声明的变量会自动提升到函数作用域顶部
「const」:可以在es6后的版本使用
- const 的行为与 let 基本相同,唯一一个重要的区别是用它声 明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导 致运行时错误;
- const 声明的限制只适用于它指向的变量的引用。换句话说, 如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。
「let」: 可以在es6后的版本使用;
「和var的区别」: let声明的是块级作用域;var声明的是函数作用域;
if (true) { var name = 'Matt'; console.log(name); // Matt } console.log(name); // Matt if (true) { let age = 26; console.log(age); // 26 } console.log(age); // ReferenceError: age没有let 也不允许同一个块作用域中出现冗余声明;
**暂时性死区 **let 与 var 的另一个重要的区别,就是 let 声明的变量不会 在作用域中被提升。
循环迭代中 var定义的变量可以反复去定义,当然后面的会覆盖前面的 , 在循环绑定事件过程中,var定义的变量无法保存,循环会在瞬间执行完 , let定义的变量不会预解析,必须先声明再使用,否则会报错 , 在循环绑定事件过程中let会在这个循环中生效,再次循环时let会重新定义生效
for (var i = 0; i < 5; ++i) { setTimeout(() => console.log(i), 0) }// 你可能以为会输出0、1、2、3、4 // 实际上会输出5、5、5、5、5 for (let i = 0; i < 5; ++i) { setTimeout(() => console.log(i), 0) }// 会输出0、1、2、3、4
「共同点」:变量声明没有初始化的时候会保存undefined;
「小结」 :
var,let ,const,分别的特点:const声明的常量,阅读代码的人一看就意识到不应该修改这个值,let本身是一个块级作用域,let没有预编译和变量提升的问题,先声明再使用更为规范,使用场景来看:let 一般用于基本数据类型;const 多数使用引用数据类型也就是函数对象;
1.2 数据类型
「ECMAScript有6种简单数据类型(也称为原始类型):Undefined 、 Null 、 Boolean 、 Number 、 String 和 Symbol」
typeof: 用来检测数据类型的方法;
Number(): 可以用于任何数据类型转换成数值; parseInt()、parseFloat(): 专门用于把字符串转换成数值;
字符串:ECMAScript中的字符串是不可变的(immutable),意思是一旦 创建,它们的值就不能变了。要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量,原先的两个销毁;
toString():吧一个值转换成字符串
Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值
「Object」:
- constructor :用于创建当前对象的函数。在前面的例子中,
这个属性的值就是 Object() 函数。
isPrototypeof(object) :用于判断当前对象是否为另一个 对象的原型。
toString() :返回对象的字符串表示。
Object 是所有对象的基类,所以任何对 象都有这些属性和方法。
递增递减中,前缀和后缀的区别,前缀是先对自身进行操作,后缀是结果出来以后再对自身操作
let num1 = 2; let num2 = 20; let num3 = --num1 + num2;//这里num1 = 1 let num4 = num1 + num2; console.log(num3); // 21 console.log(num4); // 21 let num1 = 2; let num2 = 20; let num3 = num1-- + num2;//num1还是2 let num4 = num1 + num2; console.log(num3); // 22 console.log(num4); // 21(!!)先对值调用Boolean(),然后再取反
指数操作符
let squared = 3; squared **= 2; console.log(squared); // 9 let sqrt = 16; sqrt **= 0.5; console.log(sqrt); // 41.3条件操作符
let max = (num1 > num2) ? num1 : num2;如果条件成立,则返回num1.否则num2;
do-while 里面的条件不管是否成立,所有条件都会执行一次
「for ,for in ,for of:」
遍历数组通常用for循环
for in会遍历数组所有的可枚举属性,包括原型。所以for in更适合遍历对象,不要使用for in遍历数组。
for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name
总结:
- 这章主要讲了ECMAScript中的基本数据类型;
- if,for,switch语句等, 还有函数一些的,常用的,熟悉的就不做笔记了
- 主要考察,3中声明变量的优缺点,前缀递增,后缀递增的区别,条件操作符等等,还有一些数据转换和操作,逻辑或和非得转换等,都是日常用的很多的,理解为主
本文使用 mdnice 排版