【JavaScript笔记DAY1】S2-S3词法结构&类型、值、变量

《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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值