赞
踩
定义语言的基础
规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象
js nodejs 都实现了ECMAScript
文档对象模型 Document Object Model
针对XML但经扩展用于HTML的应用程序编程接口(API)
把整个页面映射为多层节点结构,每个节点包含不同类型的数据。
借助DOM API,可删除,添加,替换,修改任何节点
DOM1:
DOM2:
DOM3:
访问和操作浏览器窗口和子窗口frame,通常把任何特定于浏览器的扩展都归于BOM范畴。
不存在defer,saync属性,浏览器会按script在页面中的先后顺序依次解析,第一个解析完后,第二个才会被解析。
对不推迟执行的脚本,必须解释完位于js标签内的的全部代码,才能继续渲染页面
在解释外部js文件时,页面会被阻塞(阻塞时间包含文件下载时间)
可跨域取得相应资源,不受同源策略限制。
放在head中,必须等JavaScript都被下载,解析,执行完后才呈现页面
把脚本放在页面底部
let script =document.createElemnet('script')
script.src='aa.js'
document.head.apendChild(script)
会严重影响性能
XHTML模式会在页面的MIME类型被指定为application/xhtml+xml时触发。
a < b中的 < 在XHTML中被当作新标签解析。但作为标签,< 后不能跟空格,
解决:
<script>
//hack,平稳退化
//<![ CADATA[
function compare(){
}
//]]>
</script>
通过文档类型 doctype切换实现
主要体现在css渲染方面,但对js也会有一些副作用。
<!--HTML5-->
<!DOCTYPE html>
js被禁用时出现
区分大小写
C语言风格
js不同解析和执行模式,ECMAScript3中的不确定行为得到处理,不安全的操作会抛出错误
整个脚本启用,顶部添加
“use strict”;
指定函数在严格模式下执行
末尾;
语句块{}
break do instanceof typeof case else new var catch finally return void continue for switch while debugger* function this with default if throw
delete in try
abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native
不初始化时,变量保存undefined
函数作用域,在函数退出时被销毁
函数内定义时省略var,可创建一个全局变量(不推荐,全局变量很难维护)
严格模式下不能定义eval,arguments的变量
声明提升,自动提升到函数作用域的顶部
块作用域
不允许出现冗余声明
不会在作用域中被提升
在全局作用域中生命的变量不会成为window对象的属性
不可能检查前面受否已经使用let声明过同名变量,不可能在没有声明的情况下声明它
不能使用let进行条件声明
<script>
var name="cjr"
let age=23
<script>
<script>
//不需要检测前面是否声明过同名变量
var name="sxl"
//
let age=20
let之前for循环中的变量会渗透到for循环外部
for(var i=0;i<=5;i++){
}
//
console.log(i) //6
for(let i=0;i<=5;i++){
}
//
console.log(i) //报错
var 对迭代变量的奇特声明和修改
for(var i=0;i<5;i++){
setTimeout(()=>{console.log(i),0} //5,5,5,5,5,5
}
是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后执行超时
逻辑时,所有的i 都是同一个变量,因而输出的都是同一个最终值。
而在使用let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。
每个setTimeout 引用的都是不同的变量实例,所以console.log 输出的是我们期望的值,也就是循
环执行过程中每个迭代变量的值。
const声明变量时必须初始化,尝试修改const声明的变量会报错
不使用var
优先使用const,
是一个操作符,不是函数,不需要参数(也可以使用参数)
let aa="cjd"
typeof aa //string
typeof(aa) //string
typeof 11 //number
只有一个值,undefined
声明但为初始化
给定变量为声明 调用typeof 也返回undefined
undefined是一个假值,检测时需注意自己检测的是undefined,而不仅仅是一个假值
只有一个值 null
表示一个空对象的指针
定义的对象 用来保存对象,初始化为null
true false
true不等于1
Boolean() //将其他类型的值转换为布尔值
let message="hello"
let messageAsBoolean=Boolean(message)
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | “” |
Number | 非零数值 | 0,NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在) | undefined |
if等流程语句会自动执行其他类型到布尔值的转换
第一位必须为0,跟0-7
070 > 56;
严格模式下无效
数值前缀为0x(区分大小写),数字不区分大小写
0x 跟0-9 A-F(也可小写)
在算术计算时,始终被转成十进制
保存浮点数的内存空间为整数的两倍,1. 10.0将被转换为整数
对于极大极小的数,用e/E(科学计数法)表示。
3.12e7 31200000 3.12乘10 7
浮点数的最高精度17位小数
范围
Infinity
NaN
isNaN() 任何不能被转换为数值的值使函数返回true
数值转换
Number() 转string时必须全部为数字才能转为有效数字
转型函数,可用于任何数据类型
转换规则:
布尔值,true 转换为1,false 转换为0。
数值,直接返回。
null,返回0。
undefined,返回NaN。
字符串,应用以下规则。
如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。
因此,Number(“1”)返回1,Number(“123”)返回123,Number(“011”)返回11(忽略前面
的零)。
如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零)。
如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整
数值。
如果是空字符串(不包含字符),则返回0。
如果字符串包含除上述情况之外的其他字符,则返回NaN。
对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换结果是NaN,则调用
toString()方法,再按照转换字符串的规则转换。
parseInt() 必须以数字开头
从第一个非空字符开始转换,如第一个字符不是数值,+,-,立即返回NaN。碰到字符串尾,非数值字符结束。
es5不具备解析八进制的功能
第二个参数:基数 ,多少进制
paeseFloat()
只解析十进制
转义序列
字面量 | 含义 |
---|---|
\n | 换行 |
toString()
null undefined没有
参数:基数
String()
能将任意类型的值转换为字符串
``
${}
String.raw`\u00A9`
符号类型
确保对象属性使用唯一标识
let sym=Symbol()
let otherSym=Symbol()
smy == otherSmy //false
let fooSmybol=Symbol('foo')
let sym=Symbol.for('foo')
let otherSym=Symbol.for('foo')
smy === otherSmy //true
Symbol.keyFor('sym')
new Object()
Object类型是他实例的基础。Object类型所具有的任何属性,方法同样存在具体的对象中。
object实例的属性方法:
前缀版:
变量的值会在语句被求值前改变
后缀版:
递增递减在语句被求值后才改变
规则:
不限于整数
对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
对于字符串,如果不是有效的数值形式,则将变量的值设置为NaN 。变量类型从字符串变成
数值。
对于布尔值,如果是false,则转换为0 再应用改变。变量类型从布尔值变成数值。
对于布尔值,如果是true,则转换为1 再应用改变。变量类型从布尔值变成数值。
对于浮点值,加1 或减1。
如果是对象,则调用其(第5 章会详细介绍的)valueOf()方法取得可以操作的值。对得到的
值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变成
数值。
Math.pow() **
Math.pow(3,2) //9 不推荐使用
3**2
小于(<)、大于(>)、小于等于(<=)和大于等于(>=),
用法跟数学课上学的一样。这几个操作符都返回布尔值
如果操作数都是数值,则执行数值比较。
如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较。
如果没有valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
如果有任一操作数是布尔值,则将其转换为数值再执行比较。
在使用关系操作符比较两个字符串时,会发生一个有趣的现象。很多人认为小于意味着“字母顺序靠前”,而大于意味着“字母顺序靠后”,实际上不是这么回事。对字符串而言,关系操作符会比较字符串中对应字符的编码,而这些编码是数值。比较完之后,会返回布尔值。问题的关键在于,大写字母的编码都小于小写字母的编码
1. 相等,不相等 ==
先转换再比较
2. 全等,不全等 ===
仅比较不转换
等于和不等于
ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则。
如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为0,true 转换为1。
如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则。
null 和undefined 相等。
null 和undefined 不能转换为其他类型的值再进行比较。
如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两
个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN 不等于NaN。
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。
全等和不全等
全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。全等操作符由3 个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回true
? :
简单赋值用等于号(=)表示,将右手边的值赋给左手边的变量,
,
if(){
}else{}
if(){
}else if(){
}else{}
循环体内的代码至少执行一次
do{
}while()
while(){
}
while无法实现的逻辑,for也无法实现
for(var i=0;i<10;i++){
}
while循环的简化
迭代语句,枚举对象的非符号键属性
//与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const。
for(const kk in window){
console.log(kk)
}
ECMAScript 中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。
如对象值为null,undefined。for-in抛出错误,或不在执行循环体
如果for-in 循环要迭代的变量是null 或undefined,则不执行循环体。
迭代语句,用于遍历可迭代对象的元素
for (const el of [2,4,6,8]) {
document.write(el);
}
区别:
for…of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
支持生成期约(promise)的异步可迭代对象
label:statement
start:for(var i=0;i<8;i++){
for(var i=0;i<9;i++){
if(i==3){
break start}}
console.log(i)
}
标签将由break,continue语句引用。与循环语句配合使用
break退出循环执行循环后面的语句
continue退出本次循环,从循环顶部继续执行
var num=0;
outer:
for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5&& j==5){
break outer;
}
num++;
}
}
switch ("hello") {
case "hello":
alert()
break;
case "good":
break;
default:
alert()
}
arguments对象
数据类型详细介绍
基本数据类型:Undefined,Null,Boolean,Number,String,Symbol
按值访问,操作的就是储存在变量中的值
引用类型:
复制值时,实际是一个指针,指向存储在堆中的一个对象。两个变量引用同一个对象。
储存方式不同
原始值:副本
引用值:
都是按值传递
function setName(obj){
obj.name="nn";
obj=new Object();
obj.name="cc"';
}
var person=new Object()
setName(preson);
对象传递到函数后被复制给obj,函数内部,obj={},即使传入的是一个对象,obj也会按引用来访问。
如是按引用传递,那函数内部重写obj,这个变量引用的是一个局部对象
typeof “jj”
[] instanceof Array
上下文在其全布代码执行完毕后会被销毁。
作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。
内部上下文可通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部的任何东西。
函数参数被认为v是当前上下文中的变量。
try/catch
with
标记清除
主流垃圾收集算法
当变量进入上下文,比如在函数
内部声明一个变量时,这个变量会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永
远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时,
也会被加上离开上下文的标记。
计数引用
但很快就遇到了严重的问题:循环引用
全局变量
定时器
闭包
var now=new Date()
不传参数:当前日期时间
创建特定时间日期对象:传入表示该日期的毫秒数
Date.parse()
参数:表示日期的字符串
返回:相应日期的毫秒数
这个方法的实现因地区而异
美国浏览器支持的格式:
- “月/日/年”,如"5/23/2019";
- “月名 日, 年”,如"May 23, 2019";
- “周几 月名 日 年 时:分:秒 时区”,如"Tue May 23 2019 00:00:00 GMT-0700";
- ISO 8601 扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如 2019-05-23T00:00:00(只适用于
兼容 ES5 的实现)。如传入的字符串不能表示日期,返回NaN
直接将表示日期的字符串传给Date(),默认调用Date.parse()
Data.UTC()
参数:年,月(0,1),天(1)[,小时(0),分种,秒,毫秒]
toLocalString() 返回与浏览器运行的本地环境一致的日期和时间。
toString() 带时区信息的日期时间
匹配规则
匹配模式:
/aa/gi
元字符
( [ { \ ^ $ | ) ] } ? * + .
global:是否设置g标志
igonoreCase:
lastIndex:开始搜索下一匹配项的字符位置
multiline:
source:
exec()
参数:要应用模式的字符串
返回数组:
index:匹配项在字符串中的位置
input:应用正则匹配的字符串
第一项是与整个模式匹配的字符串,
其他项是与模式中捕获组匹配的字符串
设置了g:每次调用exec()都会在字符串中继续查找新匹配项
不设置:同一字符串多次调用始终返回一个匹配项信息
test()
模式与参数匹配返回true
函数实际是对象,函数名实际是指向对象的指针,不与某个函数绑定
解析器会率先执行函数声明,函数表达式必须等到解析器执行到她所在的代码行,才会被真正解释执行
length:函数希望接收的参数个数
prototype:
在特定作用域中调用函数,设置函数体内this的值
严格模式下,this不会转为windows
apply:运行函数的作用域,参数(array,arguments)
call:
bind:
new Boolean(false) //true falseObject对象,在布尔表达式中会自动转换为true
永远不要使用 原始布尔值和布尔对象的差别很大
toString()
参数:几进制
返回:相应基数形式的数值字符串
toFixed()
按指定小数位返回数值的字符串表示 ,四舍五入
toExponential()
参数:小数位数
返回以科学计数法表示的数值字符串。
toPrecision()
参数:结果数字中的总位数
let num=10;
num.toString(2); //1010
num.toFixed(2) //"10.00"
(10).toString()
num.toExponential(1) //"1.0e_1"
num.toPrecision(1) //"1e+1"
num.toPrecision(2) //"10"
Number.isInteger() //辨别一个数值是否是整数
小数位的0的数是整数
charAt()
以单字符串的形式返回给定索引位置的字符
参数:基于0的字符位置
"abc".charAt(2) //c
charCodeAt()
字符编码
返回指定索引位置的码元值
"abc".charCodeAt(2) //99等于16进制63,c的编码U+0063
fromCharCode()
字符串解码
String.fromCharCode(97,98) //ab
这个对应关系在扩展到 Unicode 增补字符平面时就不成立了。问题很简单,即 16 位只能唯一表示65 536 个字符。这对于大多数语言字符集是足够了,在 Unicode 中称为基本多语言平面(BMP)。为了表示更多的字符,Unicode 采用了一个策略,即每个字符使用另外 16 位去选择一个增补平面。这种每个字符使用两个 16 位码元的策略称为代理对。
"ab声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/871216
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。