JS学习笔记
本文主要为JS的学习笔记,基于MDN的文档,尤其是A_re-introduction_to_JavaScript。
JS学习笔记
基础类型
JS包含以下类型:
- Number
- String
- Boolean
- Symbol(ES2015新增)
- Object
- Function
- Array
- Date
- RegExp
- null
- undefined
数字
在JavaScript中,除了BigInt,不存在整数类型,都是IEEE754的double类型,都是浮点数。
存在NaN Not a Number,也存在Infinity和-Infinity两个特殊值,可以用isFinite来判断。
字符串
都是UTF-16的编码单元的序列,每一个编码单元由16位二进制数来表示,由一个或两个编码单元来表示一个字符。
可以用.length属性(而不是方法)来获取长度。
其他类型
null表示空值,undefined表示未定义未从初始化的值,未初始化的变量就是undefined类型。
JS存在布尔类型,false 0 空字符串“” NaN null undefined都会被转换为false。可以用Boolean显示转换,或在if中隐式转换。
变量
存在三种声明变量方法,let const var。
let
声明块级作用域的本地变量,可选地初始化值。
const
声明不可修改的常量,在定义域内可见。
var
使用var在声明的整个函数都是可见的,没有块作用域的限制。
运算符
使用==运算符能够自动类型转换,如果不需要则使用===运算符。类似的还有!=和!==运算符。
控制结构
if else,while do-while和c语言类似。
for循环可以和c语言类似,但也存在不同的两种循环:for-of和for-in循环。
1 | for (let value of array){ |
1 | for (let property in object){ |
switch可以基于数字或者字符串,记得break。
对象
可以简单理解未“名称-值”对,类似字典。在js中,除了核心类型,core object,一切都是对象。名称部分是字符串,值可以是一切数据类型。
创建空对象方法,其中更推荐第二种,因为JSON格式:
1 | var obj = new Object(); |
创建对象实例如下:
1 | var obj = { |
访问方法支持如下:
1 | obj.details.color |
第二种方法有点在于可以被看做字符串,但可能无法在后期被编译器优化。
创建对象可以用函数,如下所示:
1 | function Person(name,age){ |
数组
数组是特殊的对象,以数字为类型名,只能用[ ]访问,包含特殊的属性:length,他比最大索引值大1。
创建数组传统方法如下:
1 | var a = new Array(); |
注意第二种,length的值,他比最大索引值大1。访问不存在的数组索引,会得到undefined。
除了传统for,for-of,还可以用forEach方法.如下所示:
| 参数 | 描述 | | :———————————– | :———————————————————– | | function(currentValue, index, arr) | 必需。 数组中每个元素需要调用的函数。currentValue必需。当前元素index可选。当前元素的索引值。arr可选。当前元素所属的数组对象。 | | thisValue | 可选。传递给函数的值一般用 “this” 值。 如果这个参数为空, “undefined” 会传递给 “this” 值 |
调用如下:
1 | var arr = [1, 2, 3, 4, 5]; |
增加元素用.push。还有些其他方法,查表就行。
函数
没有返回值的函数会返回undefined,调用函数没有提供足够参数会被undefined替代,传入过多参数会被忽略。
函数访问了函数体内为arguments的内部对象,包含所有参数。如下实现avg的方法:
1 | function avg(){ |
可以使用剩余参数操作符,来实现上述功能:
1 | function avg(...args){ |
js也可以创建匿名函数。也可以给函数命名来递归调用。
注意this指针的问题,this
的上下文可变, 如果在一个对象上使用点或者方括号来访问属性或方法,这个对象就成了 this
。
举例如下:
1 | function makePerson(first, last) { |
.prototype
是可以被所有实例共享的对象,当访问某个实例没有定义的属性时候,会检查.prototype
里面是否存在。使用如下:
1 | function Person(first, last) { |
对于new,可以有下面的类似实现,注意apply
:
1 | function trivialNew(constructor, ...args) { |
call
函数可以用来设置this
,用例如下:
1 | function lastNameCaps() { |
内部函数
函数内部可以定义函数,,而且可以访问父作用域的变量。如下所示:
1 | function parentFunc() { |
这种方法可以减少全局变量,避免污染命名空间。
闭包
闭包样例如下:
1 | function makeAdder(a) { |
当调用makeAdder
时创建了作用域对象,带有属性a,然后makeAdder
创建一个函数并返回。闭包就是函数与其被创建时候带有的作用域对象的组合。