基本类型
- 变量二次声明无意义,除非在第二次声明的时候,也赋值
- 有一些保留字
- javascript保留字
- 使用保留字报错类型:
Uncaught SyntaxError: Unexpected token finally
-
while
只有一条语句的时候可省略大括号 - 循环标签使用方式
- 在需要跳出的
for
循环层添加label
- 在
continue
和break
后添加同名label
数据类型
- 有
String
,Number
,Boolean
,Undefined
,Null
,Object
- 使用
typeof
后有string
,number
,boolean
,undefined
,object
,function
- 注意和数据类型相比,少了
null
多了function
- 结果都是小写
-
undefined
和null
使用==
相等。计算时,undefined
是NaN
,null
是0 - 返回布尔值的地方
- 关系运算符
-
&&
,||
,!
- 转化为false的情况
- '',0,NaN,undefined,null,false
-
if
后需要布尔类型,[]
和{}
其实是true
数值
-
Number.MAX_VALUE
和Number.MIN_VALUE
- 科学记数法
- 当小数点前有21位,还是正常显示。有22位,开始科学计数
- 当小数点后有5位0,正常显示。有6位0,开始科学计数
- 各进制前缀,
0x
十六,0o
八,0b
二 - NaN和
isNaN()
- Infinity和
isInfinity()
-
parseInt()
第二个参数说明了数据是什么进制。同时,只能转化为十进制
字符串
- 长字符换行,每行后用
\
- 转义字符
- 可有转移符号
\n
,\r
,\t
,\\
等 - 可有转移字符,都对应unicode码点
-
\HHH
三位八进制 -
\xHH
两位十六进制 -
\uHHHH
四位十六进制
-
-
bit
,Byte
,KB
,MB
,GB
,TB
- 存储单位和网速的单位,不管是 B 还是 b,代表的都是 字节 Byte。
- 带宽的单位,不管是 B 还是 b,代表的都是 比特 bit 。
- Base64是最常见的用于传输(8Bit)字节码的编码方式
- ASCII 是针对英文字符编码的方式
- Unicode 是针对多种语言进行编码的方式
- 为了解决Unicode编码在互联网上传播的问题,各种规范出现
utf-8
,代表每次8个位传输数据
- GBK本来扩展自ASCII,后渐渐形成GBK。因为还有很多少数名族的语言
对象
- 创建对象
{}
- new Object
-
Object.create(prototype)
,这种可以利用原型创造一个新的对象,经常用在继承
- 对象引用
- 两个变量对引用同一个对象,则共用
- 其中一个取消对对象的引用,不会影响另外一个
var a = {}
var b = a
a = 1
console.log(b) // {}
- 检测全局变量,使用
a in window
方式,如果直接使用if(a)
在没有a
的情况下会报错 -
delete
成功删除之后返回true
,不能删除继承的属性 -
in
用于检测对象是否含有某个属性,也就是键名 -
for in
遍历对象和继承的可遍历属性,跳过不可枚举属性 - 关于属性的两个方法
Object.defineProperty(obj,propName,{})
obj.hasOwnProperty()
数组
- 其实
arr[0]
等同与arr['0']
和arr[0.00]
- 类数组对象
- arguments
- 元素集合
- 字符串
- 类数组转化成数组
Array.property.slice.call(arrayLike)
- 数组也能使用
in
,会将索引和属性遍历出来 - 数组空位计算在内,但是空位和undefined是不一样的。使用数组的
forEach
方法、for...in
结构、以及Object.keys
方法进行遍历,空位都会被跳过
函数
- 不会重载,后边的会覆盖前边的同名函数
- 在
if
语句块中只能使用函数表达式,不能使用函数定义 -
fn.name
属性返回紧跟在function关键字之后的那个函数名 -
fn.name
返回定义时参数个数 -
fn.toString()
返回函数的源码 - 函数的作用域是定义时所在的作用域,和运行时作用域无关
var a = 1;
var x = function () {
console.log(a);
};
function f() {
var a = 2;
x();
}
f() // 1
- 当函数传入对象作为参数的时候
- 如果修改对象某个属性,将对外部存在影响
- 如果是替换掉整个参数,不会影响到外部
- 同名参数,取后出现的值。即使只传入第一个,但是也会取后者
undefined
-
arguments.callee
返回函数本身 - 闭包作用
- 读取函数内部的变量
- 让变量始终保存在内存中,保存上次运行的状态
- 函数的立即调用有两种写法
-
eval
在严格模式下,声明变量不能影响外部变量。但是赋值语句等还是可以改变外部变量值
运算符
- 字符串的比较是按照字典的顺序,靠后的大
// 严重注意,字符串形式的数值比较
'2' > '11' // true
[2] > [11] // true,因为会转换成 '2' > '11'
- 对象参与比较,会调用
obj.valueOf().toString()
- 进制不同,但是转化为10进制相同,就全等
- 严格相等运算符比较的是地址,而大于或小于运算符比较的是值。
{} === {} // false
[] === [] // false
- 原始数据类型有string,number,boolean。它们混合比较的时候,会转换成数值类型再进行比较
'true' == true //false
// 第一步 Number('true') ---> NaN
// 第二部 Number(true) ---> 1
// NaN == 1 ---> 结果为false
- 对象与原始类型值比较,对象转化成原始类型的值,再进行比较。
[1] == 1 // true
[1] == '1' // true
[1] == true // true
- 逻辑运算符和位运算符,位运算符可以用来扩大或缩小2的n次方
-
void
用来防止页面跳转 - 赋值运算符和三元运算符,是从右到左的
数据类型转换
- 主要是String,Boolean,Number之间的转换
错误处理机制
- Error的
name
和stack
属性存在兼容问题,后者可以显示错误首先是在哪里抛出的 - 错误类型和出现原因
- synaxError 语法错误
- referenceError 引用错误
- 调用不存在的值
- 不允许赋值
- typeError 类型错误
- 由 new 引起,不能对基本类型使用 new
- URIError url参数不正确的时引起
- 主要由编码的几种方法引起
- evalError 使用错误
- rangeError
- catch中的
return
语句会延迟到finally
中执行
编程风格
- 关于
()
和空格的问题
- 定义非匿名函数和调用函数,函数名和
()
不能有空格 - 其他情况,都有一个空格
- 全局变量可以使用大写区分
- 建议不要将目的不同的语句合并成一行、