ECMAScript(ES):JS的核心语法 DOM:让JS操作页面中的HTML元素 BOM:就是提供API让JS可以操作浏览器,比如关闭浏览器
#JS是什么 JavaScript(缩写:JS)是一门完备的 动态编程语言。当应用于 HTML 文档时,可为网站提供动态交互特性。
JavaScript 相当简洁,却非常灵活。开发者们基于 JavaScript 核心编写了大量实用工具,可以使 开发工作事半功倍。其中包括:
- 浏览器应用程序接口(API)—— 浏览器内置的 API 提供了丰富的功能,比如:动态创建 HTML 和设置 CSS 样式、从用户的摄像头采集处理视频流、生成3D 图像与音频样本,等等。
- 第三方 API —— 让开发者可以在自己的站点中整合其它内容提供者(Twitter、Facebook 等)提供的功能。
- 第三方框架和库 —— 用来快速构建网站和应用。 1.变量和数据类型
var(ES3) function(ES3)创建函数(函数名也是变量,只不过存储的值是函数类型的而已) let(ES6) const(ES6) import(ES6) 基于ES6的模块规模导出需要的信息 class(ES6) 基于ES6创建类
/*
*语法:
* var [] = 值
* let [] = 值
* const [] = 值
*/
省略var定义的是全局变量. 可以使用一条语句定义多个变量,用逗号隔开即可: var message = "hi", found = false, age = 29;
- 命名规范 var studentInfo _stidentInfo下划线在前的是公共变量 $studentInfo一般存储的是JQ元素
2.数据类型
- 基本数据类型(值类型)
- 数字number
- 字符串string
- 布尔
- null
- undefined
- 引用数据类型
- 对象object
- 普通对象
- 数组对象
- 正则对象
- 日期对象
- 。。。
- 函数function
- 对象object
- ES6中新增加的一个特殊的类型:Symbol,唯一的值 var n = 13; //=>0 -13 13.2都是 数字类型中有一个特殊的值NaN(not a number)代表不是一个有效的数字,但是属于number类型的)
var s = '' or "" "{}"所有与用单引号或者双引号抱起来的都是字符串,里面的内容是当前字符串中的字符(一个字符串由零到多个字符组成)
[引用数据类型] var o = {name: '嘀嘀嘀' , age: 9}; // 普通的对象:由大括号包裹起来,里面包含多组属性名和属性值(包含多组键值对) {}空对象
var ary = [12,23,34,55]; // 中括号包裹起来,包含零到多项内容,这种是数组对象, []空数组
var reg = /-?(\d| ([1-9]\d+))(.\d+)?/g; // 由元字符组成一个完整的正则 //没有空正则,否则就是单行注释了
[symbol] 创建出来的是一个唯一的值 var a = Symbol('JS'); var b = Symbol('JS'); 但这两个是不相等的 a == b 是false的, 可能使用场景:const a = Symbol('FLAG'); 用来创建一个唯一且不能修改的值
JS代码如何被运行以及运行后如何输出结果
如何被运行
- 把代码运行在浏览器中(浏览器内核来渲染解析)
- 基于NODE来运行(NODE和浏览器一样也是一个基于V8引擎渲染和解析JS的工具)
获得结果
-
alert 基于alert输出的结果都会转换为字符串:把值通过toString这个方法转换为字符串,然后再输出 alert(1+1); =>'2' alert(true); =>'true' alert([12,23]); =>'12,23' alert({name: 'xxx'}); =>'[Object Object]' 对象toString后的结果为什么是这个
-
confirm:在alert的基础上多了确定和取消按钮
-
prompt:在confirm的基础上增加输入框
-
console.log:在浏览器控制台输出日志
- Elements:当前页面中的元素和样式在这里都可以看到,还可以调节样式修改结构等
- Console: 控制台,可以在JS代码中通过.log输出到这里,也可以在这里直接编写JS代码
- Sources: 当前网站的源文件都在这里
- 后面有详细讲解
-
console.dir: 比log输出的更加详细一些(尤其是输出对象数据值的时候)
-
console.table: 把一个JSON数据按照表格的方式输出
-
...自己扩展更多console输出方法
3.数据类型的详细剖析 1.number数字类型 NaN: not a number 但是他是数字类型的 isNaN: 检测当前值是否不是有效数字,返回true代表不是有效数字,返回false代表是有效数字
//语法:isNaN([value])
var num = 12;
isNaN(num); //检测num变量存储的值是否为非有效数字
isNaN('13'); //false
isNaN('汉字'); //true
isNaN(true); //false
isNaN(false); //false
isNaN(null); //false
isNaN(undefined); //true
isNaN({age:9}); //true
isNaN([12,23]); //true
isNaN(/^$/); //正则是true
isNaN(function(){}); //true
!!!重要:isNaN检测的机制
1.首先验证当前要检测的值是否为数字类型的,如果不是,浏览器会默认把值转换为数字类型
把非数字类型的值转换为数字
- 把其它基本类型转换为数字:直接使用Number这个方法转换的
[字符串转数字]
Number('13') ->13
Number('13') ->NaN 如果当前字符串中出现任意非有效数字字符,结果为NaN
Number('13.5') ->13.5
[布尔转数字]
Number(true) ->1
Number(false) ->0
[其它]
Number(null) ->0
Number(undefined) ->NaN
- 把引用数据类型值转换为数字:先把引用值调取toString转换为字符串,然后再把字符串调取Number转换为数字
[对象]
({}).toString() ->'[Object Object]' ->NaN
[数组]
[12,23].toString() ->'12,23' ->NaN
[12].toString() ->'12' ->12
[正则]
/^$/.toString() ->'/^$/' ->NaN
Number('') ->0
[].toString() ->'' => isNaN([]): false
2.当前检测的值已经是数字类型,是有效数字返回false,不是返回true(数字类型中只有NaN不是有效数字,其余都是有效数字)
parseInt / parseFloat 等同于Number,也是为了把其它类型的值转换为数字类型,和Number的区别在于字符串分析上 parseInt:把一个字符串中的整数部分解析出来,parseFloat是把一个字符串中整数和浮点数部分都解析出来 parseInt('13.5px') =>13 parseInt('width:13.5px') =>NaN 从字符串最左边开始查找有效数字字符并且转换为数字,但是一旦遇到一个非有效数字,查找结束
NaN的比较
NaN == NaN: false // NaN和谁都不相等,包括自己, NaN表示不是一个有效数字,可能是任意非有效数字
所以不能用来判断是否是NaN因为条件永远不成立,应该用isNaN
2.Undefined类型 在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined var message; alert(message == undefined); //true 字面值undefined的主要目的是用于比较,是为了正式区分空对象指针(null)与未经初始化的变量。 var message; alert(typeof messsage); //"undefined" alert(typeof age); //"undefined" 未经初始化的变量只能执行typeof的操作 显示地初始化变量仍然是明智的选择,这样如果是"undefined"就只说明是有变量没有声明
3.Null类型
Null类型是第二个只有一个值得数据类型,这个特殊得值是null。null表示一个空对象指针,用于显示地初始化变量,这样只要检查null值就可以知道相应地变量是否已经保存了一个对象地引用:
if(car != null){
}
实际上,undefined值派生自null值,因此:
alert(null == undefined); // true
尽管他们有这样地关系,但用途完全不同。
4.布尔类型
只有两个值:true/false
如何把其它数据类型转换为布尔类型?
- Boolean
- !
- !!
Boolean(1) =>true
Boolean(0) =>true
Boolean(NaN) => false
!'我爱喝奶茶' =>先把其它数据类型转换为布尔类型,然后取反
!!null =>取两次反,等价于没取反,也就剩下转换为布尔类型了,一般项目中常用这个
规律:**在JS中只有0/NaN/空字符串/null/undefined这五个值转换为布尔类型为false,其余都为true**
null&&undefined 都代表空,null:空对象指针,undefined:未定义 null:一般都是意料之中的没有,一般是人为手动的先赋值为null,后面的程序中我们会再赋值 undefined:一般都不是认为手动控制的,大部分都是浏览器自主为空
var num; //此时变量的值就是浏览器给分配的
#引用数据类型
##object对象数据类型
普通对象
- 由大括号包裹起来
- 由零到多组属性名和属性值(键值对)组成
var obj = {
name: '我爱喝奶茶',
age: 9
};
[获取]
obj.name
obj['name']
[增/改]
var obj1 = {name: 'xxx'}
var obj2 = {name: 'xxx'} //JS对象中属性名是不允许重复的,是唯一的。改就是直接赋值完事了
[删]
彻底删除,对象中不存在这个属性了
delete obj['age'] or delete obj.age
假删除:并没有移除这个属性,只是让当前属性的值为空
obj.sex = null;
思考题:
var obj = {
name: '我爱喝奶茶',
age: 9
};
var name = "zhufeng";
obj.name
obj["name"]
obj[name]
那这里的"name"和name的区别是什么?
"name"是一个字符串值,name是一个变量 =>obj["zhufeng"] 没有这个属性,属性值是undefined
一个对象中的属性名不仅仅是字符串格式的,还有可能是数字格式的,如果是这两个以外的其它格式,浏览器先转换为字符串
var obj = {
name: "我爱喝奶茶",
0: 100
};
obj[0] =>100
obj['0'] =>100
obj.0 //错误
obj[{}] = 300; //先把({}).toString()后的结果作为对象的属性名存储进来 obj['[object Object]'] = 300
obj[{}] =>获取的时候也是先把对象转换为字符串'[object Object]', 然后获取之前存储的300
var ary = [12,23];
0: 12
1: 13
length: 2
属性名可以为数字,把数字属性名称为当前对象的索引,数组也是对象,遵循对象的规则
ary[0]
ary['0']
ary.0不行
ary.length =>2
ary.['length'] =>2
数组和对象的关系:数组是对象的一种,对象有的数组也有,数组是特殊的对象,属性名是数字。
#JS中的判断操作语句 1.if/else if/ else
var num = 12;
if(num>10)
{
num++;
}else if(num>=0 && num<=10)
{
num--;
}else
{
num+=2;
}
console.log(num);
只要有一个条件成立,后面不管是否还有成立的条件,都不再判断执行了
关于条件可以怎么写? 不管再条件判断中写什么,最后总要把其计算出true/falsel来判断条件是否成立
##typeof 在JS中用来检测数据类型的方式之一,还有:
- instanceof
- constructor
- Object.prototype.toString.call()
typeof 12
typeof []
typeof {}
typeof '我爱喝奶茶'
返回值:返回一个字符串,其中包含着数据类型,如:"number", "string","boolean","undefined"
typeof null =>"object" 因为null代表空对象指针(没有指向任何的内存空间)
BAT面试题:
var num = parseInt('width:33.5px');
if(num == 35.5)
{
alert(0);
}else if(num==35)
{
alert(1);
}else if(num == NaN)
{
alert(2);
}else if(typeof num == 'number')
{
alert(3); //alert输出的都是字符串格式的'3'
}else
{
alert(4);
}
typeof操作符的操作数可以是变量,也可以是数值字面量。typeof是一个操作符而不是函数,尽管圆括号可以使用但不必须。 ##三元运算符
语法:条件?成立做的事:不成立做的事;
var num = 12;
if(num>10)
{
num++;
}else
{
num--;
}
//改写成三元运算符
num>10?num++:num--;
如果某一部分不需要做任何处理,使用null/undefined/void 0 占位即可,但什么都不写会报错
'10' == 10 //如果等号左右两边的类型不一样,首先会转换为一样的数据类型,然后再进行比较 '10' === 10 绝对比较,数据类型和值都一样才相等
#循环语句 1.for循环 continue 跳出当前循环,循环体中后面代码不再执行,执行下轮循环 break: 结束整个循环,后面的代码不再执行