js中五种基本数据类型:Number String Boolean Null Undefined 还有一个Object数据类型
-
null专门用来表示空对象,typeof null 返回的就是一个object对象类型
-
undefined 声明变量但是不给变量赋值时,值就是undefined typeof undefined返回值也是undefined
-
强制类型转换
-
其他数据类型转成字符串
-
调用被转换数据类型的toString方法。如a.toString(),不改变原值,只将结果返回
null和undefined不能转换,没有toString()方法,此方式只适用于其他基本类型
-
调用String()函数,并将需要被转换的数据作为参数传入。如String(a),不改变原值,只将结果返回,这种方式可以转换null和undefined。但是对Number和Boolean来说就是调用toString方法
-
-
其他数据类型转成Number
-
使用Number()函数,用法同String()函数。
- 不能转为数字的(有非数字内容)会转为NaN
- 空字符串转成0
- 布尔值true为1 false为0
- Null转成数字也是0
- undefined转为数字是NaN
-
parseInt()和parseFloat()把字符串转成整数或浮点数。这种转换方式只提取字符串中的有效内容,遇到无效内容即截止。
- 开头无效就是NaN
- 对非String使用这两个方法,他会先将其转为String,再操作
-
其他进制的数字:十六进制0x;八进制0开头;二进制0b开头(有兼容性问题)
"070"这种字符串,有些浏览器当成八进制,有些当成十进制解析。
在parseInt(“070”,10)第二个参数写成数字表示进制
-
-
其他数据类型转成Boolean
- 数字除了0和NaN是false,其余都是true
- 字符串只有空串是false,其余都是true
- null和undefined转成布尔值是false
- 对象也会转成true
-
-
运算符(不改变原变量,结果作为返回值返回)
-
typeof就是一个运算符,可以获得一个值的类型。将该值的类型以字符串的形式返回,即返回值是字符串,用来描述类型的字符串
-
算术运算符:
- +:
- 数字相加,Boolean、null等会转成Number类型再操作。
- undefined为NaN,任何数字加上NaN结果都是NaN。
- 字符串用+来拼串,任何值和字符串做加法都会先转成字符串再进行拼串操作。可以利用这一特性让其他数据加个空串+""进行隐式类型转换,实际调用String函数
- -:对两个值进行减法运算,会自动将其他类型转成Number类型,包括100-“1”=99
- *:对两个值进行乘法运算,同减法。
- /:对两个值进行除法运算,同减法。以上三种方法也可以做隐式类型转换。
- %:取模(余)运算。
- +:
-
一元运算符:
- +:正号,不会对数字产生任何影响。可以用于隐式类型转换,将任意数据类型转成Number
- -:负号,进行符号的取反。非Number类型先转成Number再运算
-
自增自减:(会改变原值)
- ++:一个变量自增后,原变量值立即加1。
- a++先使用后加1;即a++的值等于原a值
- ++a先加一再使用;即++a的值等于a+1的值,自增后的值
- –:变量自减,原变量值立即减1。同自增。
- ++:一个变量自增后,原变量值立即加1。
-
逻辑运算符:
-
!非:对一个值进行非运算(取反);如果对非布尔值进行运算,会转成布尔值再运算
可以对任意一个非布尔值取反两次,做隐式类型转换,原理和Boolean()函数一样
-
&&与:对符号两侧的值进行与运算并返回结果,两端都是true才返回true。非布尔值会先转成布尔值再运算,并且返回原值。两个值都为true,返回后面的值。两个值都是false返回靠前的值。(与短路识别有关)
js中的"与"为短路的与,第一个为false就不检查后面了,第一个true才检查
-
||或:对符号两侧的值进行或运算并返回结果,有true为true。返回原值。第一个为true直接返回第一个。第一个为false,直接返回第二个值,不管第二个真假。
同样的,第一个为true就不检查后面的值,第一个为false才检查
-
-
赋值运算符:
- =:将符号右侧的值赋给左侧的变量
- +=、-=、*=、/=、%=:等价于a = a + n
-
关系运算符:
< 、>、 >= 、<=比较大小关系,成立返回true,不成立返回false。
-
非数值进行比较会将其转换成数字再比较。
-
任何值和NaN做任何比较都是false
-
如果两端都是字符串,不会转成数字,而是分别比较字符串中字符的Unicode编码,这种比较是一位一位进行比较,两位一样比较下一位。所以比较两个字符串类型的数据一定要先进行转型,不然容易乱掉。
输出Unicode编码:字符串转义字符例如,\u开头:“\u2620”;网页中使用&#xxx; 这里的2620是十六进制的,而xxx是十进制的
-
-
相等运算符:
-
==:相等运算,相等返回true,不相等返回false。使用这种运算符比较时,如果值的类型不同,会自动进行类型转换然后再比较。
-
一般布尔和字符串都是转成Number类型。(null != 0)
-
undefined衍生自null,所以(undefined==null返回true)
-
NaN不和任何值相等,包括他本身。(NaN != NaN)
所以要通过isNaN()函数判断一个值是否是NaN isNaN(NaN)
-
-
!=:不相等运算。不相等返回true,相等返回false。如果值的类型不同,会自动进行类型转换然后再比较。
-
=:全等运算。用来判断两个值是否全等,与类似,但不做类型转换,类型不相等直接返回false。(undefined===null返回false)
-
!==:不全等。用来判断两个值是否全等,与!=类似,但不做类型转换,类型不相等直接返回true
-
-
条件运算符(三元运算符):
- 语法: 条件?语句1:语句2。条件为true执行语句1,为false执行语句2;返回执行结果
- 如果条件表达式的结果为非布尔值,会将其转成布尔值再运算。
运算符优先级(不清楚可以用括号改变优先级)从上到下优先级递减,同级按代码中出现顺序从左往右
. 、[] 、new () ++、– !、~、+(单目)、-(单目)、typeof、void、delete(单目是只需要一个操作数的意思) %、*、/ +(双目)、-(双目)(双目是需要两个操作数的意思 比如 a+b) <<、>>、>>> <、<=、>、>= 、!、=== & ^ | && || ? :(三目运算符) =、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、 -
-
代码块:用{}来为语句进行分组,同一个{}中的语句要么都执行要么都不执行,一个{}中的语句也叫一个代码块。只具有分组作用,没有其他用途。里面的变量也可以在外面访问到。
-
流程控制语句
-
条件判断语句:if(条件表达式) 表达式为true才执行if后的语句(else if / else)
prompt()弹出一个可输入文本的提示框,可以作为键盘输入用,输入值作为返回值返回。在它前面加+可以对用户输入的数据进行隐式的Number类型转换
-
条件分支语句:switch(条件表达式){case 表达式: break;default: break;},条件表达式和表达式比较,如果全等,就会执行case后面的语句,所以记得加break。所有比较结果都是false就执行default后面的语句
switch的条件表达式可以传true,这样case后面的表达式可以传判断语句和true比较,成立执行,不成立执行default(这就跟用if基本没有区别了)
-
循环语句
- while(条件表达式){循环体} ,执行前先判断表达式,true执行循环体,false跳出循环,或break跳出循环
- do{循环体}while(条件表达式),先执行再判断,表达式为true再执行,false不再执行。可以保证循环体至少执行一次。
- for(初始化;判断条件;更新表达式){循环体} 初始化->判断条件,true进入循环体,false直接结束->更新表达式->判断条件
break可以立即终止离他最近的循环(只能放循环或者switch里面,if里不能用break);
可以为循环语句创建一个label.来标识当前的循环。写法:label:循环语句;使用break语句时,可以在break后跟着一个label.这样break将会结束指定的循环,而不是最近的
continue可以跳过当此循环,开始下一轮循环;
console.time(字符串),开启计时器。传入的字符串作为计时器的标识。console.timeEnd(字符串),终止计时器。
-
-
对象:
-
分类:
- 内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用。如:Math String Number Boolean Function object. . .
- 宿主对象:由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象。如BOM DOM
- 自定义对象:由开发人员自己创建的对象。var obj = new Object()
-
属性:
- 用obj.key的方式读取
- 如果要使用特殊的属性名,不能采用.的方式来操作。需要使用另一种语法:obj[“属性名”] =value。读取时也需要采用这种方式。使用[]这种形式去操作属性,更加的灵活,
在[ ]中可以直接传递一个变量, 这样变量值是多少就会读取那个属性 - in运算符:通过该运算符可以检查一个对象中是否含有指定的属性,有返回true,没有则返回false。用法:"属性名”in对象 “name” in obj,如果对象中没有,原型上有也返回true;而hasOwnProperty()只有对象自身有该属性才返回true
js对象的属性值可以是任意的数据类型,包括对象
-
基本数据类型和引用数据类型:
-
js中的数据都是保存到栈内存中的。
-
基本数据类型都是直接在栈内存中存储。值与值之间独立存在,修改一个变量不会影响其他的变量。
-
引用数据类型(对象)在栈内储存的是对象名+地址:每创建一个新的对象,就会在堆内存中开辟出一个新的空间,变量保存的就是这个地址(对象的引用)。
如果两个对象保存的是同一个地址,所以修改地址里面的数据时,当其中一个通过变量修改属性时,另一个也会受到影响。如果另其中一个等于null,就相当于指向了一个新的对象,另一个并不会受到影响。
比较基本数据类型时,比较的是值。比较两个引用数据类型时,比较的是地址
-
-
-
创建对象:
-
var obj = new Object();
-
var obj={},这种方法在创建的时候就可以指定对象中的属性。
-
使用工厂方法创建对象:function creatObject(name,age){var obj = new Object() return obj;}使用工厂方法创建的对象,使用的构造函数都是0bject。所以创建的对象都是bject这个类型,就导致我们无法区分出多种不同类型的对象。
-
创建一个构造函数:function Person(name,age){} 创建实例对象:var per = new Person()
构造函数创建流程:1.立刻创建一个新的对象2.将新建的对象设置为函数中this3.逐行执行函数中的代码4.将新建的对象作为返回值返回
-
-
-
函数
-
函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)。函数中可以保存一些代码在需要的时候调用。用typeof检查一个函数对象,返回function
-
创建:
- 构造函数来创建一个函数对象:var fun = new Function()
- 函数声明创建函数:function 函数名([形参]){函数体}
- 函数表达式:var 函数名 = function([形参]){函数体},这里创建的是匿名函数。
函数对象也有普通对象的所有功能,但是很少用构造函数来创建一个函数对象
-
参数:对象的参数可以是任何类型的数据,包括对象、函数。传函数的时候加括号传的是返回值,不加括号传的是函数本身
-
IIFE立即执行函数:函数定义完立即被调用,立即执行函数往往只会执行一次
格式:(function(){})()
-
方法:对象的属性可以是函数,我们在使用这个函数的时候就说使用对象的方法。
-
枚举对象的属性:for … in 如:for(var key in obj){}想输出属性名可以obj[key]使用方括号语法。
-
-
作用域:
-
全局作用域:直接编写在script标签中的js代码都在全局作用域。在页面打开时创建,页面关闭时销毁。全局作用域中的变量都是全局变量,在页面的任意部分都可以访问
-
变量提升
var声明的变量有变量提升,但是这步没赋值,如果不用var定义变量,则变量不会被提前声明
-
函数的声明提前:
使用函数声明形式创建的函数(即 function 函数(){}),他会在代码执行之前就被创建,所以可以在函数前调用。
使用函数表达式形式创建的函数(即 var func = function(){})不会被提前声明,所以不可以在函数之前使用。
-
全局作用域中有个window对象,可以直接使用,代表一个浏览器的窗口。
- 函数作用域:调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。每调用一次函数就会创建一个新的函数作用域,多次调用一个函数,他们之间是相互独立的。
在函数作用域可以访问到全局作用域的变量,全局作用域无法访问函数作用域中的变量。当一个变量在二者中都有定义,先在自身作用域中寻找,有就使用,没有向上一级作用域中找,直到找到全局作用域,也没找到就报错。
-
-
this:解析器在调用函数每次都会向函数内部传递进一个隐含的参数 ,这个隐含的参数就是this, this指向的是一 个对象,这个对象我们称为函数执行的上下文对象,与函数的调用方式有关。
- 以函数的形式调用,this永远都是window
- 以方法的形式调用,this就是调用方法的那个对象
- 使用构造函数的方法新建对象,this就是新建的对象
-
原型prototype:我们所创建的每一个函数, 解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
如果函数作为普通函数调用,prototype没有任何作用;当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__ proto__ 来访问该属性。
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象。
访问对象的方法或属性时,当前对象找不到就会去原型对象上找,由原型链逐层向上,直到找到Object(它的原型为null)。所以对象共有的方法和属性可以统一添加到原型对象上。
-
垃圾回收GC:处理程序运行中产生的垃圾。当一个对象没有任何的变量或属性对他进行引用,此时我们将永远无法操作该对象,所以这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理。在js中由自动的垃圾回收机制,会自动将这些对象从内存中销毁。我们只需要将这种对象设置为null。