JavaScript的学习之路(1)

254 阅读5分钟

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再次声明。参数默认值不是传值的,而是惰性求值,每次都会重新计算默认值