【js】【读书笔记】廖雪峰的js教程读书笔记

最近在看廖雪峰的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 whilees6引入新的循环for offorEach循环
  • es6Map,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库都是这么干的:jQueryYUIunderscore等等
  • es6的快级作用域元素let,const,let用于定义块级变量,const用于定义常量,常量建议全部大写字母表示
  • 解构赋值,可以快速的把数组、对象的属性赋值给变量
  • 在一个方法内部,this是一个特殊变量,它始终指向当前对象
  • this调用,如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window
  • ECMA决定,在strict模式下让函数的this指向undefined
  • 函数本身的apply,call方法,apply装饰器
  • 高阶函数的概念,参数的为函数的函数为高阶函数
  • arraymap,reduce用法,调用map的回调函数和实际的函数参数可能不一样导致异常的结果 array.prototype.map map的回调有4个参数,而如果如array.map(parseInt),parseInt只有2个参数,而且第二个参数和calltable第二个参数性质不一样,造成结果异常,示例请看廖雪峰的js小示例
  • arrayfilter用法,用于对数组值的过滤
  • arraysort排序函数,默认的是通过字符串的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接口
  • CSBS的由来
  • MVVM的原理,双向绑定,model-dom对应
  • https的原理
  • es6的生成器generator
  • js原型继承object.create,__proto__
  • 当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype对象,最后,如果还没有找到,就只能返回undefined
  • new functionname,通过new方法来创建对象
  • window对象有innerWidthinnerHeight属性,可以获取浏览器窗口的内部宽度和高度。内部宽高是指除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高。
  • window对应的,还有一个outerWidthouterHeight属性,可以获取浏览器窗口的整个宽高
  • 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默认可以跨域,其他请求跨域需要经过处理
  • es6promise,canvas用法
原文地址:https://www.cnblogs.com/china-flint/p/10252120.html