JavaScript组成
ECMAscript
只提供了语言基础
BOM(Browser Object Model)
纳入HTML5
DOM(Document Object Model)
浏览器基本支持
<script defer="defer" async src="../" type="text/javascript"></script>标签
属性
type 类型(一般值为text/javascript),不写的话,浏览器默认也是这
src
外部引用时用到
async(只适用于外部脚本)
异步加载文件、在页面load之前,所以异步脚本不要修改DOM
defer(只适用于外部脚本)
延迟加载,延迟到整个页面都解析完毕了之后
开头只能用字母、下划线_、美元符$
由字母、下划线、美元符、数字组成
字母也可以是ASCII码、Unicode码
建议驼峰写法
全局严格模式、函数局部严格
属于松散类型,可以保存任何值
var 标识符
局部变量
函数体内定义的变量称为局部变量
在函数调用时创建,执行结束时销毁,仅在函数中可调用执行,外部调用会报错 function foo(){ var msg="hello world"; console.log(msg) } //msg在foo函数内部定义,属于局部变量,在函数调用时创建,执行结束时销毁 console.log(msg)// undefined foo();// hello world注意
函数体内变量未使用var声明,则声明的变量为全局
function foo1(){ msg = "我是全局变量"; } console.log(msg)// 我是全局变量基本数据类型
number string boolean null undefined
复杂数据类型,其他类型最终都都是object衍生出去的
object
undefined
变量定义(声明)后,未初始化(赋值),则默认值为undefinednull
一般赋值给变量准备在将来保存对象
表示空指针对象,所以typeof null返回object
undefined == null// true 本质上,undefined派生于null
number 包括整数、浮点数(双精度),采用IEEE754格式,0.1 + 0.2 != 0.3,因为这种格式本身精度问题,所以不建议比较小数
进制:严格模式下,八进制不生效
数值范围
+infinity/-infinityNaN(Not a Number)但是,typeof NaN === 'number'
NaN与任何值都不相等,包括它本身(NaN==NaN// false)
isNaN()方法,用于判断一个值是不是NaN
如果是一个对象,则先调用valueOf(),判断是否可以转换为数值,不能则继续调用其toString()方法
转换方法
Number()
Boolean值,true——1;false——0
数值——数值
null——0
undefined——NaN
string
Number('123');// 123 Number('1.1');// 1.1 Number('011');// 11 不识别八进制 Number('0xf');// 15 Number('');// 0 // 除了上面的格式外,其他都返回NaN Number('123a')// NaNparseInt(),用于字符串转化
匹配数字、负号、科学计数法e 从左向右,一直匹配第一个符合上述规则的字符,直至遇到了一个非上述规则的字符,则停止解析
识别进制
parseInt('123abc');// 123 parseInt('1.1');// 1 parseInt('');// NaN可传入第二个参数作为进制规则
如:parseInt('0xf',16); // 15
parseFloat()
不识别十六进制
0xf——0
如果识别表示为整数,则会返回整数 123abc——123 12.0——12
String
toString()
undefined、null无此方法
可传入参数控制转换进制
var num=10; num.toString(2);// 1010 num.toString(16);// aString()
规则如下
如果值有toString()方法则返回相应结果null返回'null'undefined返回'undefined'Object
constructor 构造函数
hasOwnProperty()
判断属性是否属于该实例中的属性
isPrototypeOf()
判断某原型是不是当前对象的原型
propertyIsEnumerable()
判断某属性是否可枚举
toLocaleString()
toString()
valueOf()
label
配合break,continue来跳出、跳过指定循环
out:for(var a in [1,2,3,4]){ for(var b in [1,2,3,4,5]){ if(a+b==6){ break out; } } }function(){}
arguments可以取到所有传入函数内的参数 arguments[0]可通过下标取值arraylike,是一个类似数组的列表,不可枚举,需要转为数组基本数据类型
number、string、Boolean、null、undefined 五种引用数据类型
object、date、array等基本数据类型
保存在数据栈中,复制相当于重新创建了一个变量
所以,两个对象互不影响,相互独立
var a = 1; var b = a; a = 2; console.log(b); // 1引用数据类型
保存的变量值,实际上是一个指针,指向存储在堆中的一个对象。复制相当于复制了这个指针,而指向内存的对象并没有改变。
所以,其中一个改变,复制的变量也会跟着改变
var obj1 = new Object(); var obj2 = obj1; obj1.name='gem'; console.log(obj2.name); // gem所有函数中的参数都是按值传递的,如同复制一样。但是又不一样
复制,有按值(基本数据类型),按引用(引用数据类型)两种
但传参,只能按值
基本数据类型,相当于在局部中又定义了局部变量。局部修改不影响外部
function add(num){ num+=10; return num } var num=20; var result=add(num); console.log(num);// 20 console.log(result);// 30引用数据类型作为参数,参数依旧按照值的形式传递
function add(obj){ obj.name='gem'; obj=new Object();// 局部变量的修改了引用到另一个堆中的对象,但对外部的obj的引用并不影响 obj.name='jin';// 所以是按值传递的 //如果是按引用传递,那么修改obj指向另一个对象时,函数外部的obj也应该一起改变 } var obj=new Object(); add(obj); console.log(obj.name);// gema instanceof b——a的原型是不是b,根据其原型链来识别
当a不是引用数据类型(基本数据类型),则直接返回false,因为基本数据类型不是对象
全局执行环境(在web浏览器下,全局执行环境为window对象)
每个函数拥有自己的执行环境
自下向上搜索(由内至外)
延长作用域
try-catch语句的catch块with语句以下无块级作用域,与类c语言不同
iffor声明变量
通过var声明变量,会被自动添加到最近的环境中如果没有用var声明,则其会被添加到全局环境中通过标记变量的状态,来确定变量是否需要被销毁
通过记录变量被拿去引用(赋值)给另外的变量的次数来确定是否需要销毁
bug——两个值相互引用(循环引用)则无法被销毁,一直占用内存
当一个变量被使用完成,并且后续不会再使用。则将其赋值为null,以便垃圾收集器将其回收
2020年7月4日17:34:46
有点后悔没早点看这本书,并且我认为我只看一遍还不够