//不会一个个知识点的记笔记,只去记录一些比较坑的点或者比较特别的点
1、三个基本概念(变量、值、类型)
*变量没有类型,值有类型
2、变量声明关键词:
let ,
var,
const(使用const时,会使变量和值之间的引用关系不能再改变。而js中的原子值无法改变)
3、类型:7种(symbol ,null ,undefined ,number ,string ,object(非原子类型) , boolean )
4、typrof :查看变量类型
typeof 的三种例外:
null:object
被声明,未赋值,undefined
typeofa(未被声明的,不会报错,只会返回undefined)
5、number(8个字节,64位)
控制有效位
toFixed()//小数点后
toPrecision()//有效位
//一个奇怪的地方0.1+0.2(可以用Number.EPSILON)
NaN(不与任何值相等,包括自己)
Number.MAX_VALUE(当超过后,会靠近最接近的数)
Infinity(无穷大)
+0-0(如何区分;==0&&/Ifinity==Infinity)
Object.is(a,b)//甚至可以区分0,-0,NaN
eg:var a = NaN,
b = NaN;
console.log(Object.is(a, b))
判断整数:Number.isInteger(61)//判断一个数是不是整数
6、String类型(16个无符号整形)
一些方法:
concat:连接
indexOf:返回一个子字符串
charAt:获取指定位置的字符
[]简写模式
length:长度
toUpperCase:大写
声明后,就不再改变//变了,就不是自己了
使用双引号
转义:\
'""'
模板字符串(不需要转义):``
let a='dads\nfdf'
let b=`dadas
fas`
使用变量: ${a+b}
let c=`我想要知道${a+b}`
7、object类型
1)创建
对象字面量、constructor
对象字面量
let o={
name:'da',
age:18
}
constructor
let o =new Object()
o.name=’malin’
o.age=18
2)访问value
obj.key//点操作符
obj[key] //括号
//第二种使用更广一些,比如key中间有空格,但是啰嗦
3)删除 delete
4)ES6中提供更简单的方式
letname = 'nalin'
letage = 11
letperson = {
name,
age
}
console.log(person)
8、build-in object(boolean string number)//封装好的原生方法
**使用constructor,绝大多数都需要new
**自动装箱、自动拆箱
如果build-in不加new时,实现强制类型转换
1)封装了boolean的object的一个奇怪特性,object是一种像是真的值,取反会变成假
let a = new Boolean(false)
if (!a) {
console.log(1111);
} else {
console.log(222222);
}
9、array
1)创建
var a = [0, 1]
a[3] = 1
console.log(a)//会有空洞
2)方法:push
pop
unshift
shift
splice(a,b)//删了a-b之间的东西
splice(a,b,‘a’,‘da’)//删了a-b之间的东西,然后把后面的添加进去(如果放入的数据多于删掉的,会将之后的占用)
slice(a,b)切片
length:改变length可以截断数组
强制类型转换后为false:共6种
“N0fun”
N:NaN
0:
false:
undefined:
n:null
""
####################################################################################################################################
array的一些方法:
poppush
shuiftunshift
splice:删除
slice(start,end)
复制数组:ab=a.slice()
一些build_in objects
function
1)创建:
声明: function fun(){}
函数表达式:var f=function(){}
箭头函数:()=>{}
new(不建议用)
函数声明:
参数:各种奇怪,
可选
函数表达式:函数名可选
箭头函数:
参数为一:括号变成可选
let person={
say(){
console.log('hello')
}
}
10、symbol类型:(提供一种与存储无关的方式来表达一个符号)
动机:为对象加入 private属性
创建:
let my=Symbol('sdada');不需要,也不能使用new
返回的是原子类型,而不是
letmys=Symbbol('dada')
letmobj=Object(mys)
letobj={}
obj[my]='dadadas'
使用:symbol1==symbol symbol1!=symbol2(两次调用,不可能返回同一个值)
共享 symbol 类型的值
es6全局注册表
lets=Symbol.for('sdada')//查找是否存在,存在?不存在就创建
11、prototype:原型
每个obj关联仅关联一个Prototype
prototype本身必须是一个object或者null
内部状态:放在一个槽中
对象之间通过原型关系,形成原型链
一个object包含:
三部分 :
properties:完全控制权
internalslots:内部槽 (无法增加或减少槽数,但是可以改变)
internalmethods:(无法改变
原型链:
创建时关联:
letobj=Object.create(proto)
创建后关联:
Object.setPrototypeOf(obj,proto)
优点:动态性更强//像其他语言的继承,可以具有多态性***但是不可以重载
如何查找key:向上查找,没有的话,返回undefined
12、变量作用域:
程序主函数
Global object(全部对象)
NaN,undefined都是一个key
全局对象:
值属性:Infinity,NaN ,undefined…
函数属性:isNaN(number),eval(x),parseFloat(string) …
构造函数属性:Array,Boolean, String, Number…
其他属性:Math,JSON…
邪恶特性:
全局(如果声明变量的时候,什么都不用)
全局变量不是变量
解决方法:
"usestrict";
a=1
console.log('hello')
变量作用域:
var函数作用域
//微编译
变量提升(只把声明提升到最前面)
局部变量会这样,函数也会这样
****变量提升只提升函数名 而函数提升会提升整个函数体 注意:函数提升在变量提升上面。