js的基本语法
如果只是用var 声明了变量没有赋值,该变量的值是undefined
JS是动态类型语言,变量的类型没有限制,可以随时改变类型
对于同一变量的两次声明,第二次声明时无效的,但是如果是赋值则会覆盖前一次
JS的工作方式是先解析代码,获取所有被声明的变量,再运行,使得所有的变量的声明语句都被提升到代码头部,叫做“变量提升”,赋值则不会
标签可以用于跳出多重循环和代码块 break,continue 可以配合使用
js的数据类型
typeof可以返回一个值的数据类型,对于一个未声明的变量返回"undefined"
数值相关的全局方法
pareseInt()可以将字符串转为整数,头部有空格会被去除,将尽可能的字符串转为整数,遇到不可转化的,便不再继续,如果第一个字符无法转化,则返回NaN
如果以0x 0X开头,则按照十六进制解析
对于会自动转化成科学计数法的数字,parseInt()会将科学计数法的表示方式视为字符串
pareseInt()可以接受第二个常数表示按照何进制转化
块级作用域中的函数声明与let类似,即不可在外部使用,在块内声明时,尽量使用函数表达式
即使不可能运行到,也会被赋值吗,
顶层对象在浏览器中是Windows,在node中是global,var function 定义的对象是顶层对象的属性,而其他的定义方式则不然
const命令表明该变量是一个只读变量,不可修改,与let类似,只在块级作用域内有效且须在声明后使用,const保证的是该变量指向的地址是不变的,对于简单类型而言是不变的,而复杂类型只能保证指向的地址是不变的。
解构赋值
对象的解构赋值
1.数组是有次序的,变量的取值是由其位置决定的,但是对象的属性是无次序的,因而需要属性和变量名是相同的
2.作用是可以将现有的对象的方法赋值到新的变量上
3.let {foo:baz} = {foo:'aaa',bar:'bbb'};
baz //"aaa"
这意味着对象的解构赋值的内部机制是先找到同名属性,再赋值
4.对象的解构可以指定默认值,条件是对象的属性值严格对于undefined
var {x=3}={}
x//3
var {x=3}={x:null}
x //null
5.对于已定义的变量不可以let x;{x}={x:1}
需要({x}={x:1})
6.解构赋值的规则是 只要等式右边的值不是对象或数组,就将其先转为对象
函数参数的解构赋值
function add([x,y]){
return x + y;
}
add([1,2]);//3
[[1,2],[3,4]].map(([a,b])=>a+b);
//[3,7]
运算符
非相等运算符:
1.字符串比较,按照字典顺序比较(PS:中文也有Unicod码点)
2.非字符串的比较:
1 原始类型会转成数值比较,* 所有与NaN比较都返回false *
2 对象则会先调用valusOf方法,返回的还是对象,则调用toString方法
相等运算符
相等运算符比较的是是否相等,而严格相等比较的是两个是否为"同一值"
严格相等
不同类型直接返回false,复合类型则是比较是否指向同一地址
JSON
属性名必须用"",数值只能十进制
JSON.stringify()
JSON.stringify可以将一个值转为JSON字符串,字符串满足JSON格式,可以被JSON.parse还原。
对于原始类型的字符串,结果会带双引号。
例子
JSON.stringify('foo') === "foo" 结果是"false"多了个内层双引号让JS引擎知道,这是一个字符串。
1.对象的属性是undefined、函数或XML对象,该方法会被JSON.stringify过滤。
2.数组的成员是undefined、函数或XML对象,这些值被转成null.
3.正则对象会被转成空对象。
4.方法可以接受第二个参数,指定需要转成字符串的属性。
var obj = {
'prop1': 'value1',
'prop2': 'value2',
'prop3': 'value3'
};
var sel = ['prop1','prop2'];
console.log(JSON.stringify(obj,sel));
字符串扩展
模板字符串
1.用反引号`标识,可作为普通字符串、定义多行字符串、或者在字符串中嵌入变量。
字符串中嵌入变量
let name = "Bob",time = "today";
Hello ${name},how are you ${time}?
2.在模板字符串中使用反引号,需要用反斜杠转义。
3.使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。使用trim方法可以消除它。
4.大括号里可以放入任意JS表达式,可以进行运算和引用对象属性,调用函数。如果值不是字符串,则会调用toString。
5.“标签模板”:模板字符串还可以跟在一个函数名后,该函数将被调用处理该模板字符串。
let a = 5;
let b=10;
tagHello ${ a+b } world ${a*b};
等同于 tag(['Hello ',' world ',''],15,50);
tag函数第一个参数是数组,而其他参数则是模板字符串各个变量被替换的值。
函数的扩展
函数参数的默认值
ES6可以为参数设置默认值
function log(x,y = 'world'){
console.log(x,y);
}
参数变量是默认声明的,不能使用let或const再次声明。参数默认值不是传值的,而是惰性求值,每次都会重新计算默认值