《JavaScript权威指南》自学时记下的笔记。
DAY 1 in 2021/12/29
S2 词法结构
字符集
Unicode
JS区分大小写,HTML不区分(XHTML区分但浏览器不一定)。JS中关于HTML的属性标签统统小写。
字符串可以用Unicode转义写法:s=“caf\u00e9”
注释
//行内
/*
行间
*/
直接量
12 //数字
1.2
“hello world” //字符串
‘hi’
true //布尔值
false
null //空值
/javascript/gi //正则表达式
标识符
由$、Unicode中的字母、数字、下划线组成
不能以数字开头,后续都行
行尾的分号
要加;行开头也加上。虽然JS会在缺分号无法正确解析代码时填补分号。
一个正确填补的例子:
var a
a
=
3
console.log(a)
//解析为:var a; a=3; console.log(a)
1.如果语句以“( [”开头,容易和前面连在一块造成错误。
2.涉及return/break/continue的语句不要有换行。
return
true;
//解析为:return; true;
3.涉及++/–运算符,会被归到下一行
x
++
y
//解析为:x; ++y;
S3 类型、值、变量
原始类型 & 对象类型:
原始类型包括数字/字符串/bool值
对象类型:除了原始类型以及特殊原始值(null/undefined),是属性(键值对)的集合
null/undefined:特殊原始值 啥也不是
特殊对象:函数、数组
关于方法:概念上说只有JS对象有方法,但实际上数字、字符串、bool值也有方法。JS中,只有null/undefined无法拥有方法
可变类型 & 不可变类型:
不可变:数字/字符串/bool值/null/undefined
可变类型:对象、数组
JS变量:无类型,可以被赋予如何值,可以重新赋予
数字
不区分整数和浮点数
整型:十进制、十六进制(0x/0X)(八进制ES6不支持最好不要)
浮点数[digits] [.digits] [(E|e)[(+|-)]digits]
算术运算:±*/%
调用Math对象实现其他的复杂运算
溢出/下溢时结果为:Infinity / -Infinity
被零整除也是:Infinity / -Infinity
零除零:NaN(非数字)
NaN和任何值都不相等,判断方法x!=x为true;isNaN()为true。
+0 == -0 但是1/(+0) != 1/(-0)
浮点数误差:尽量使用整数计算(货币单位用分不用元)
.3-.2 != .1
.2-.1 == .1
日期和时间
var later = new Date(2021, 11, 11, 17, 10, 30) //年 月 日 时 分 秒
注意月份由零开始 0-11代表1-12月
文本
字符串长度是16为值个数,一个长度为2的JS字符串可能表示一个Unicode字符
字符串中单引号里可以包含双引号,双引号里可以包含单引号
字符串要显示为两行:"\n"
字符串写成多行显示成一行:(ES5限定)末尾加\:
“one
long
line”
通常 HTML属性里用双引号,JS表达式里用单引号
转义字符用斜杠( \ ),斜杠如果写在非特殊字符前会被忽略
字符串相连:+
msg = "Hello,"+"world";
模式匹配用正则:两个斜线之间的文本
var pattern = /\d+/g
var text = "testing 1 2,3"
text.match(pattern) //Array(3) [ "1", "2", "3" ]
bool值
AND:&&
OR:||
取反:!
转换为false:
undefined / null / 0 / -0 / NaN / “”
if (o !== null) … //看对象o不是null时true
if (o) … //o不是false / null / undefined都是true
null和undefined
null:typeof:object //特殊对象
undefined:typeof:undefined
null == undefined //返回true
null === undefined //返回false;严格相等
全局对象
JS解释器启动时会创建一个新的全局对象
可以用this来引用全局对象:var global = this;
对于客户端JS:Window对象=全局对象,其中window属性可代替this来引用全局对象
包装对象
包装对象 是 对于字符串、数字、bool值存取属性值创建的【临时对象】,修改只发生在临时对象上。
要显式创建包装对象,可以用new Number\String\Boolean()。
包装对象与原值在”“时相等,”=“不相等。
var s = "test", n = 12, ok = true;
var S = new String(s);
var N = new Number(n);
var OK = new Boolean(ok);
s.len = 12;
S.len = 12;
console.log(s==S, s===S);// true false
console.log(s.len, S.len);// undefined 12
原始值不可变 和 对象引用可变
1.原始值不可更改!
var s = "hello";
s[2]='x';
conosle.log(s); //hello
2.对象的值可修改
var o={x:1};
o.x = 2;
o.y = 3;
console.log(o); //Object { x: 2, y: 3 }
对象的比较不是值的比较!即使两个对象属性和值完全相同,也不相等。两个数组元素完全一样,也不相等。
将对象称为引用类型。除非引用同一个基对象才相等。
var a={x:1}, b={x:1};
console.log(a === b); //false
var c = a;
console.log(a === c); //true
复制对象,需要显示复制(每个属性和元素都要复制)
var a = [1,2,3];
var b = [];
for (var i=0; i<a.length;i++)
b[i]=a[i];
console.log(b) //Array(3) [ 1, 2, 3 ]
比较对象/数组时也要遍历比较。
类型转换
需要字符串转成字符串,需要数字转成数字(无法转换NaN)
x + "" //=String(x)
+x //=Number(x)
!!x //=Boolean(x)
toString()方法和String()类似
number类的toString()可以按进制转换
另外对于浮点数,三种方法:
toFixed()根据小数点后指定位数,toExponetial()是指数计数法指定位数,toPrecision是有效数字位数。
parseInt()和parseFloat()会跳过空格、自由地根据进制解析数字。如果第一个数字就不合法那就NaN。
对象转换成原始值
转成字符串:有toString()返回toString => 有valueOf()返回valueOf() => 都没有,异常错误
转成数字:先valueOf后toString
运算符:+ == 都会让对象先转换成对应的原始值类型
对于日期对象的例外:+ == != 日期对象整成字符串
变量声明
不用var也可以,会当成全局属性,但是会出现一些bug,不要在危险边缘搞事
var a; //仍然是undefined
函数作用域
1.如果函数内不写var,可能会改变同名全局变量的值。
var scope = "global";
function f(){
scope = "local";
}
f();
console.log(scope);//"local"
2.函数体内声明的所有变量都被提前到函数体顶部。
var scope = "global";
function f(){
console.log(scope); //"undefined"
var scope = "local";
console.log(scope); //"local"
}
//上述代码等价于
function ff(){
var scope;
console.log(scope); //"undefined"
scope = "local";
console.log(scope); //"local"
}
ff()
console.log(scope);//"global"
3.如果全局变量声明不写var,类似属性,可被删除
var truevar = 1;
fakevar = 2;
delete truevar; //false
delete fakevar; //true