js就是在装修好的房子里进行动态设置
一、js的由来
全称JavaScript,但与java无关
网景公司开发
最初开发的目的:本地表单验证。用于增加客户体验好感度,减少客户端等待时间,减少服务器端压力
二、组成
1.核心js:ECMAScript5(在linux上使用)
2.bom:browser object model浏览器对象模型
3.dom:document object model文档对象模型
兼容性:核心js兼容性较佳,dom和bom兼容性相对较差
三、特点
1.弱类型语言
即对类型要求不严格,在定义一个变量后,还可以重新定义,进而可以改变其的值和数据类型
java是典型的强类型语言,即对类型要求很严格
2.脚本语言
本身具有逻辑能力和行为能力
3.解释性语言
需要被js解析器解析执行
浏览器:内置js解析器
node:js运行环境。相当于封装了js解析器(Google v8)
检测node版本号:node --version
node运行方式
1.repl环境
r:read
e:eval执行
p:print打印
l:loop循环
2.node命令
node a.js直接执行
大部分第三方软件安装在/opt或/opt/bin下,比如说node
4.从上到下按照解析顺序依次执行
代码书写顺序不一定是解析顺序
console.log(a);
var a=10;
解析:
var a;
console.log(a);
a=10;
优先解析函数声明,然后解析使用var操作符声明的变量☆
举例:
代码顺序:(按理说这样的顺序应该报错,因为你不能还没有say就function say,但可以执行,原因如上)
say();
function say(){}
解析顺序:
function say(){}
say();
执行顺序:
function say(){}
say();
5.大小写敏感的语言
html大小写不敏感
css大小写敏感
四、语法
1.变量的声明
1.标识符的声明
-
由字母、数字、下划线以及$组成
-
不能以数字开头
var 2a="" //error
var a2="" //success -
建议大家使用驼峰式命名
var firstnameandlastname=’ ’
从第二个单词开始首字母大写
var firstNameAndLastName=’ ’
建议语义化命名 -
不能使用关键字和保留字
关键字:在js中具有特殊意义的字符
保留字:未来有可能成为关键字的字符
2.变量的声明
es5:
var a;//声明一个a变量但不赋值
a=“hello”;//获取a变量并赋值hello
var b=“hello”;//变量的声明并赋值
c=“hello”;//变量的声明并赋值
c;//这样只声明不赋值是不行的
var a=2,b=3,c=4;//同时给多个变量声明并赋值
es6:
let:
使用了let声明的变量,只能声明一次,不能重复声明
不能解析提升
局部变量(只在当前作用域内有效)
const:
一般用来声明常量,一旦声明,不可修改
使用const声明的常量,只能声明一次 ,不能重复声明
不能解析提升
局部变量(只在当前作用域内有效)
如果常量值为引用数据类型,只要引用地址不变,可以修改内部属性
局部变量
let oo=20;
function say(){
console.log(oo);//能够打印出结果20
}
say();
----------------------------------------------------------------
let oo=20;
function say(){
let obj1='obj1';
console.log(obj1,'inner');//能够打印出结果obj1 inner
}
say();
console.log(obj1,'outer');//无法被打印出,显示obj1 is not defined
即全局的可以拿到局部去用,而局部的是不能拿到全局去用的
2.注释
//:单行数值
/**/:多行注释
3.语句
建议每一行语句结束使用;结尾
五、使用
1.浏览器中html
1.嵌入在html标签内部
使用script标签来嵌入
<head>
<script type="text/javascript">
var a=10;
console.log(a);
</script>
</head>
2.外部引入脚本(js代码理论上可以写在html任何位置,但需要考虑解析顺序,但建议写在head中。head中就专门写第三方文件的。)
script标签:src属性
<head>
<script src="./1.js"></script>
</head>
<!--使用了scr属性的script标签,内部的标签会被解析器忽略,即不报错也不执行-->
<!--使用了src属性的script标签内部不能写东西啦!-->
全局变量:window
2.node
repl环境
node命令
1.创建一个js文件,以.js为文件名后缀即可
2.执行node 文件名.js
全局变量:global
六、局部变量和全局变量
1.什么是?
全局变量:可以在所有js作用域内访问的变量
局部变量:只能在局部作用域内访问的变量
2.如何声明?
局部变量:
let
const
使用了var操作符并声明在函数内部
<head>
<script type="text/javascript">
var a=10;
console.log(a,'top');<!--能够被打印-->
function say(){
console.log(a,'say');<!--能够被打印-->
}
console.log(a,'bottom');<!--能够被打印-->
</script>
</head>
<head>
<script type="text/javascript">
function say(){
var a=10;
console.log(a,'say');<!--能够被打印-->
}
console.log(a,'bottom');<!--不能够被打印-->
</script>
</head>
<head>
<script type="text/javascript">
function say(){
a=10;
console.log(a,'say');<!--能够被打印-->
}
console.log(a,'bottom');<!--能够被打印-->
</script>
</head>
function say(){
console.log(a);
a=10;
console.log(a);
}
say();
该代码会报错,因为函数只有在被调用时其内部变量才会被声明,要想代码正常运行可将其改为
function say(){
a=10;
console.log(a);
}
say();
console.log(a);
七、数据类型
共有六种数据类型
typeof(a)用于测试数据类型
返回值:(即测出的a变量的数据类型)
undefined
object(null+object)
number
Boolean
string
function(function)
typeof typeof(a)
返回值类型:
string
五种基本数据类型(简单数据类型)存在于栈区
undefined:未定义类型
var a;//声明一个变量而不赋值时此时变量的数据类型为undefined,值也为undefined
var a=undefined;//直接赋值undefined,此时数据类型与值均为undefined
console.log(a);//直接打印一个既不声明也不赋值的变量,数据类型也为undefined,没有值
null:空引用数据类型(即将指向堆区,但此时没有指向堆区)
var a=null;
undefined派生自null
null==undefined:true(等等比较)
null===undefined:false(全等比较)
null类型虽然是空的,但却占据空间位置
number:数值类型
10十进制
10.3浮点数
011二进制
八进制
0xa十六进制
NaN:not a number
Infinity:无穷
isNaN(a):是不是不是一个数
当a不是一个数时,返回true:是的,它不是一个数
当a是一个数时,返回false:不是,它是一个数
isFinite(a):是否为无穷苏
false:a是一个无穷数
true:a不是一个无穷数
Boolean:布尔类型
true:
false:
string:字符串类型
使用单引号、双引号或反引号包裹的字符
一种引用数据类型(复杂数据类型)存在于堆区
object:
-
function
-
array数组
var arr=new Array();
arr.valueOf(); -
date
共有的属性和方法:
constructor属性:构造者
toString()方法:将当前变量转换为字符串类型
每一种子类调用toString的返回值不一定一样
vlaueOf()方法:返回当前变量的原始值/实际值
每一种子类调用valueOf的返回值不一定一样
引用数据类型声明方法:
var obj={
name='lisi',
age=20
}
var obj=new Object();
obj.name='lisi';
obj.age=20;
只要一见到new,就要在堆区中新开辟一块内存空间
八、数据类型转换
null和undefined不参与转换(它们可以往其他数据类型转换,但其它数据类型不太好往它俩转)
number
*—>number
1.Number(a):number转换函数,a即为想要被转换的变量
null转换结果为0
undefined转换结果为NaN
true转换结果为1
false转换结果为0
string(空、非空、数字)
空字符串“”转换结果为NaN
非空字符串
空格字符 转换结果为NaN
字符 转换结果为NaN
数字 转换结果为number类型的对应数字
既有数字又有字符 转换结果为NaN
“10l”转换结果为NaN
“a10”转换结果为NaN
“+10” 转换结果为number类型的对应数字
“10.3” 转换结果为10.3
2.parseInt(a):解析整型
null转换结果为NaN
undefined转换结果为NaN
true转换结果为NaN
false转换结果为NaN
string(空、非空、数字)
空字符串“”转换结果为NaN
非空字符串
空格字符 转换结果为NaN
字符 转换结果为NaN
数字 转换结果为number类型的对应数字
既有数字又有字符
“10l”转换结果为number类型的对应数字(从前到后依次解析,碰到字符就停止)
“a10”转换结果为NaN
“+10” 转换结果为number类型的对应数字
“10.3” 转换结果为整数,直接舍弃小数点后的数
3.parseFloat(a):解析浮点型
null转换结果为NaN
undefined转换结果为NaN
true转换结果为NaN
false转换结果为NaN
string(空、非空、数字)
空字符串“ ”转换结果为NaN
非空字符串
空格字符 转换结果为NaN
字符 转换结果为NaN
数字 转换结果为number类型的对应数字
既有数字又有字符
“10l”转换结果为number类型的对应数字(从前到后依次解析,碰到字符就停止)
“a10”转换结果为NaN
“+10” 转换结果为number类型的对应数字
“10.3” 转换结果为小数
一元运算符
+a:相当于调用了Number(a)
-(-a):相当于调用了Number(a)
Boolean
Boolean(a)
*—>Boolean
null转换结果为false
undefined转换结果为false
零 转换结果为false
非零 转换结果为true
string(空、非空、数字)
空字符串“ ”转换结果为false
非空字符串 转换结果为true
对一个变量连用两次逻辑非
相当于将当前变量转换为Boolean类型
!!null:false
string
*—>string
1.String(a) string转换函数
null:“null”
undefined:“undefined”
false:“false”
任何参数的转换都相当于直接在变量值之外添加双引号或单引号
2.toString(num) 方法
null和undefined没有toString()方法
num:进制数
a.toString(2):代表先将当前a变量转换为2进制的number数,再 所以前面这个变量必须是本身就能够转换为number值的
true.toString():“true”
10.toString(2):“10”
10.toString(2):1010
九、值传递问题
基本数据类型的值传递
问题:
var a=10;
a=b;//b没有生命也没有赋值。应为b=a;
b=b+1;
console.log(a);
console.log(b);
结果:undefined undefined
修改后结果:10 11
引用数据类型的值传递
问题:
var obj1={
name:'lisi',
age:20
}
obj1=obj2;//同上的错误,应为obj2=obj1;
obj2.name='terry';
console.log(obj1.name);
console.log