JavaScript的组成
- Dom:文档对象模型,也就是节点,包括css树和标签树
- Bom:浏览器对象模型说的就是浏览器;其中有,window对象,navigator对象,location对象,screen对象,performance对象…其实都是globall全局对象下的,浏览器称其为window,
- ECMAScript:js的核心,也就是我们常说的es,包括语法,对象,类型…
认识script标签
- 一般我们都会把script标签放在body标签后执行,因为dom是桉顺序执行的,所以如果放在最前边,浏览器加载解析时会先解析script标签后在渲染dom结构,而且js代码运行会比html标签慢很多,所以就会出现白屏现象。
script标签中有异步加载方法(但这种方法是加载其他文件时使用的)async这个属性就可以解决上面问题,是异步加载方法,还有defer属性,当文档解析后才会执行
- 还有一些其他属性:
- charset:指定src代码字符集,
- crossorigin:配置相关请求头
- ;integrity:加密签名验证
- ;src:资源路径;
- type:类型;
- 还有一种动态加载script
let script =document.createElement('script')
script.src='jsl.js'
script.async=true
script.defer=false
document.head.appendChild(script)
- 验证浏览器是否支持js的标签;如果不支持或者被关闭js的会显示noscript中的内容
语言基础
- es的中的语言是区分大小写a和A是两个不同的字符
- 严格模式:“use strict”
- 关键字和保留字;es中关键字和保留字是不能用作变量名的
变量
- 声明变量的关键字:var let const
- 其中let和const是es6新提出的概念;let和const的出现弥补啦var的缺陷;
因为var声明变量时会提高变量;而且没有作用域,很难控制
//这里说一下提高变量
console.log(a) // 报错
---------分割线
console.log(a) // undefind
var a
- let和const声明不会提高变量,而且有作用域块;{}就是他们的作用域块
数据类型
- js有引用数据类型和基础数据类型
- 基础数据类型:
string,number,boolearn,null,undefind,symbol
- 引用数据类型:
object。array,function
- Number
转化number的方法:Number()强制转化为数字类型,如果不能被转化则会为nan,
parseInt();会转化为整数,如果有其他不是数字类型会被忽视;parseInt(123.11qwww)会被转化为123;还可以转化进制;如果传两个参数则第二个参数为进制;
parseFloat();会转化为浮点数,但是他始终会忽视第二个点后的parseFloat(0123.11.01bb) // 123.11
Number()可以转化空字符串为0而parseInt()则转化为nan
- Number的隐式转化
-:在数值前调用-操作法,会调用Number()将其转换
<和>:< 或 >的任意一方只要出现数字类型就会把另一方通过Number()转换
==:同上一样,只要有一边出现数字类型就会转换
- / %:处理非数字时都会调用Number()
number的方法 (调用都是num.方法):
toString()
传入进制数,会对应转换为进制
toFixed()
传的数字表示小数点后的位数
toExponential()
返回科学计数法
toPrecision()
会根据情况返回结果,就是根据情况决定调用toFixed还是toExponential;
Numbe.isInteger()
是否为安全整数;1.00为安全,1.001不是
console.log(Number.isInteger(1)); // true
console.log(Number.isInteger(1.)); //true
console.log(Number.isInteger(1.000000)); //true
console.log(Number.isInteger(1.01)); //true
- String的强制和隐式转化
toString();转化为字符串
隐式转换:当+前面是是字符串时会转换+后为字符
String的方法:
charAt()
返回指定索引字符串
charCodeAt()
:返回指定索引位置的的码原值
codePointAt()
:识别指定马点
String,fromCharCode()
:可以接受多个值,返回所有数值对应的字符串拼接在一起
Sting.fromCodePoint()
:同上也可以接受多个码点
let hh2=String.fromCharCode(98,55357,56842,100)
let hh=String.fromCodePoint(98,128522,100)
console.log(hh); //b😊d
console.log(hh2===hh); // true
console.log(hh.charCodeAt(1)); //55357
console.log(hh.codePointAt(1));//128522
console.log(hh.charAt(1)); // ?
String方法还有concat();拼接一个或多个字符串
字符串截取方法有三个
slice,substring,substr
这三种方法为正数时且只有一个参数时没什么区别,都是如果只有一个参数为字符的索引位置(包括索引)开始 一直截取到字符结束位置;
如果两个参数slice和substring第一个为字符索引(包括索引)位置开始;第二个为索引结束位置(不包括结束位置);
而substr的第二个参数则表是数量,要截取的数量
如果仅有一个参数而且为负数那么这三个方法又不一样啦
slice和substr表示为字符长度减去负数的绝对值的索引位置;而substring如果为负数则返回整个字符串
如果第二个参数为负数他们又不一样
slice会把负数转化为长度加上负数的绝对值的位置;而substr则会返回空字符串;substring依然转化为0,会把最小的作为开始位置
- 只要substr第一个参数是负数就会忽略第二参数
substr(-1,2)=substr(-1) - substring无论是一个参数还是两个参数只要是负数就会转化为0,并且成为开始位置;
- slice无论哪一个是负数都会遵守 长度减去负数的绝对值;
看下面例子
let st = '0123456'
console.log(st.slice(2)); //23456
console.log(st.substr(2)); //23456
console.log(st.substring(2)); //23456
console.log(st.slice(2, 6)); //2345
console.log(st.substr(2, 6)); //23456 这里说明就算设置的长度超出范围也只会截取到最后
console.log(st.substring(2, 6)); //2345
// ============================
console.log(st.slice(-4)); //3456
console.log(st.substr(-4)); //3456
console.log(st.substr(-8)); //0123456 如果负数的绝对值大于字符长度则返回整个字符
console.log(st.substring(-4)); //0123456
console.log(st.slice(1, -4)); //12
console.log(st.substring(1, -4)); // 1
console.log(st.substr(1, -4)); // ' '
console.log(st.substr(-1, 4)); // 6
console.log(st.substring(-1, 4)); // 0123
console.log(st.slice(-1, 4)); // '' ==slice(6,4)所以为空
String位置
indexOf()
:返回第一次匹配的索引;如果传第二个参数则第二个参数为开始搜索的索引位置
lastIndexOf()
:返回最后一次匹配索引位置;如果传入第二个参数则从第二索引位置开始往前搜索
let a='hahali'
console.log(a.indexOf('a',2));// 3
console.log(a.lastIndexOf('a',2)); //1
startsWith和endWith,includes
这三个方法都会返回布尔值
startsWith是否以某个字符开始
endsWith是否以某个字符结束
includes是否含有某个字符
当传一个参数时没什么不同
startsWith和includes如果传第二参数则为从第二参数索引位置开始
endsWith则第二个参数为从头开始字符串的长度
let f = 'foobarbaz'
console.log(f.startsWith('foo')); //true
console.log(f.endsWith('bar')); //false
console.log(f.includes('bar')); // true
console.log(f.includes('bar', 4)); //false
console.log(f.startsWith('foo', 1)); //false
console.log(f.endsWith('bar', 6)); //true
- trim()去除前后空白
- repeat()复制方法
let k='hh'
console.log(k.repeat(4).concat(' 我笑啦')); //hhhhhhhh 我笑啦
- padStart和padEnd填充字符串指定长度
let l="li"
console.log(l.padStart(4)); // ‘ li’
console.log(l.padEnd(4)); // ‘li ’
console.log(l.padStart(4,"哈")); //哈哈li
console.log(l.padEnd(4,"哈")); //li哈哈
字符串转大小写
转大写toLocaleUpperCase(),toUpperCase()
转小写toLocaleLowerCase(),toLowerCase()
字符串搜索及替换
search()方法和正则方法差不多/ /;返回的是第一次找到的索引
**repalce()**正则表达式做匹配;第二个参数是替换的
let text='ab AC add'
console.log(text.search(/ac/i)); //3
text=text.replace(/ac/ig,'ac')
console.log(text);//ab ac add
用法
- typeof可以检测数据类型,但是null比较特殊,他的数据类型为object
- null==undefind //true
boolean
所有非空的字符串都为true
所有的非0数字都为true;
所有的object(除null)都为true
null为false;因为通过NUmber()为0
undefind为false;同上;以为Number转化后为0
- Symbol
符号,他与其他类型不太一样,不能作为函数与new一起用;new Symbol() // 报错
通过Symbol.for创建全局符号;只有通过Symbol.for创建的全局符号才会被Symbol.keyFor()
找到
let o=Symbol.for("ggg")
Symbol.keyFor(o) // 'ggg'
-----------------------
let o=Symbol("ggg")
Symbol.keyFor(o) // undefind
-----------------
Symbol.keyFor(123) // 会跑出异常
符号也可以作为属性
let s1=Symbol(['foo'])
let o={
[s1]:val}
console.log(o) //{Symbol(foo):val}
- 检查对象中Symbol属性的值:Object.getOwnPeopertySymbols()
- 返回带有Symbol属性的对象(
只要带有Symbol就会返回整个对象
):Object.getOwnPropertyDescriptors() - 只返回带有Symbol的key值:Reflect.ownKeys()
- 可枚举属性Symbol.iteror, @@iterator也可以表示