最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛
- 编写代码尽量使用严格模式
use strict
JavaScript
引擎是一个事件驱动的执行引擎,代码总是以单线程执行- 执行中会自动在每行的结尾添加分号
- 区分大小写
- 浮点数通常比较难比较大小,参考es6 number epsilon
NaN
,Infinity
都是number
类型NaN
表示不是一个数字,Infinity
表示无穷大,NaN和其他任何数字都不相等Null
表示空值 ,undefined
表示未定义- 对象的键都是字符串类型
- 变量可以多次赋值,但是只能申明一次
var
- 变量本身类型不固定的语言称之为动态语言,相反的未静态语言如
java
es6
中表示多行字符串可以用````,在此之前都是用- 字符串本身不可变,不能修改字符串中的单个字符,可以基于字符串修改生成新的字符串
- 数字
30
和字符串"30"
是两个不同的元素 - 访问对象不存在的属性不会报错,只会返回
undefined
in
判断对象是否具有某属性,属性可能为对象自有属性也可能为继承属性,如果查看是否为对象的自有属性,用hasOwnProperty
null
,undefined
,0
,NaN
,""
视为false
,其他的都为true
- 循环的集中方式
for
,for in
,while
,do while
,es6
引入新的循环for of
,forEach
循环 es6
的Map
,Set
,iterable
元素Array
,Map
,Set
都是属于iterable
类型,都可以用for of
进行循环iterable
内置forEach
循环- 函数也是一个对象,没有
return
的函数返回undefined
arguments
,只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数,arguments
类似Array
但它不是一个Array
,调用时即使不传递参数也可以通过arguments
获取到所有参数- 函数中,可以用
es6
的新参数rest
来代替多个参数 - 内部函数可以访问外部函数定义的变量,反之则不行;如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量
- 函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部,JavaScript引擎自动提升了变量的声明,但不会提升变量的赋值
- 默认的全局对象
window
,所有的全局变量(包含函数)都会绑定为全局对象window
的一个属性 - 任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报
ReferenceError
错误 名字空间
全局变量会绑定到window
上,不同的JavaScript
文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现,减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中,许多著名的JavaScript
库都是这么干的:jQuery
,YUI
,underscore
等等es6
的快级作用域元素let
,const
,let
用于定义块级变量,const
用于定义常量,常量建议全部大写字母表示解构赋值
,可以快速的把数组、对象的属性赋值给变量- 在一个方法内部,
this
是一个特殊变量,它始终指向当前对象 this
调用,如果以对象的方法形式调用,比如xiaoming.age()
,该函数的this
指向被调用的对象,也就是xiaoming
,如果单独调用函数,比如getAge()
,此时,该函数的this
指向全局对象,也就是window
ECMA
决定,在strict
模式下让函数的this
指向undefined
- 函数本身的
apply
,call
方法,apply装饰器 高阶函数的概念
,参数的为函数的函数为高阶函数array
的map
,reduce
用法,调用map
的回调函数和实际的函数参数可能不一样导致异常的结果 array.prototype.mapmap
的回调有4个参数,而如果如array.map(parseInt),parseInt只有2个参数,而且第二个参数和calltable第二个参数性质不一样,造成结果异常,示例请看廖雪峰的js小示例array
的filter
用法,用于对数组值的过滤array
的sort
排序函数,默认的是通过字符串的ascii
码进行排序,当然,sort
也是个高阶函数,你可以自定义排序算法- 错误包含逻辑错误(代码错误)和运行错误(权限,网络连接,文件不存在)
错误传播
如果在一个函数内部发生了错误,它自身没有捕获,错误就会被抛到外层调用函数,如果外层函数也没有捕获,该错误会一直沿着函数调用链向上抛出,直到被JavaScript引擎捕获,代码终止执行es6
的箭头函数(也属于匿名函数)- 箭头函数和匿名函数的区别为,箭头函数里的this总是指向词法作用域,也就是外层调用者(这里我也不大懂廖雪峰啥意思)
- 可变参数以3个点
·
开始,表面参数的个数不限制 function (x,y,...rest)rest
表示可选参数 typeof
检测类型,[],null,{}
返回的都是object
,undefined
返回的是undefined
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
- 用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
- 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...}
- typeof操作符可以判断出number、boolean、string、function和undefined
- 判断Array要使用Array.isArray(arr)
- 判断null请使用myVar === null
- 判断某个全局变量是否存在用typeof window.myVar === 'undefined'
- 函数内部判断某个变量是否存在用typeof myVar === 'undefined'
- 任何对象都有toString()方法吗?null和undefined就没有!确实如此,这两个特殊值要除外,虽然null还伪装成了object类型。
- 数字转换成字符串
123..toString(); // '123', 注意是两个点!
(123).toString(); // '123'
node
查找模块的顺序依次为内置模块
,全局模块
,当前模块
node.js
加载模块时使用了匿名函数加载模块的方式来规避各个模块内变量冲突的问题- 判断是处于浏览器环境还是node环境
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}
Date
相关- JavaScript的月份范围用整数表示是0~11,0表示一月,1表示二月
- 使用Date.parse()时传入的字符串使用实际月份0112,转换为Date对象后getMonth()获取的月份值为011
var now = new Date();
now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST)
now.getFullYear(); // 2015, 年份
now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月
now.getDate(); // 24, 表示24号
now.getDay(); // 3, 表示星期三
now.getHours(); // 19, 24小时制
now.getMinutes(); // 49, 分钟
now.getSeconds(); // 22, 秒
now.getMilliseconds(); // 875, 毫秒数
now.getTime(); // 1435146562875, 以number形式表示的时间戳
json
实际上是js
的一个子集json
的数据类型和js
的数据类型一致node
的同步异步的关系- 流的概念
- web协议简介
nodejs
底层采用C/C++
编写,然后对外暴露为javascript
接口CS
,BS
的由来MVVM
的原理,双向绑定,model-dom
对应https
的原理es6
的生成器generator
js
原型继承object.create
,__proto__
- 当我们用
obj.xxx
访问一个对象的属性时,JavaScript
引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype
对象,最后,如果还没有找到,就只能返回undefined
new functionname
,通过new
方法来创建对象window
对象有innerWidth
和innerHeight
属性,可以获取浏览器窗口的内部宽度和高度。内部宽高是指除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高。window
对应的,还有一个outerWidth
和outerHeight
属性,可以获取浏览器窗口的整个宽高navigator
对象表示浏览器的信息screen
对象表示屏幕的信息location
对象表示当前页面的URL信息document
对象表示当前页面。由于HTML
在浏览器中以DOM
形式表示为树形结构,document
对象就是整个DOM
树的根节点history
对象保存了浏览器的历史记录css
的属性在js
中换成驼峰写法,如font-size
写成fontSize
,p.style.fontSize = '20px'
- 删除后的dom节点虽然不在文档树中了,但其实它还在内存中,可以随时再次被添加到别的位置
JavaScript
代码都不可能同时有多于1个线程在执行- 跨域方法,1在同源下使用 2在同源下搭建代理服务器,代理服务器转发请求到真正的服务器 3jsonp方式,通过get请求js的方式那样请求数据 4 cros 跨域
js
,css
默认可以跨域,其他请求跨域需要经过处理es6
的promise
,canvas
用法