javascript:
js:
脚本语言
作用:进行本地的表单校验
需要解析执行
js解析器
火狐:js解析器
谷歌:js解析器
兼容性较差
统一规则:
javascript
js:核心js + dom +bom
全称javascript
java:服务器端语言
没有关系
1.由来
网景公司:(主开发浏览器)
统一标准:
javascript:核心js + dom(文档对象模型)+ bom(浏览器对象模型)
ECMAScript:核心js es5 es6
dom:document object model
文档:HTML5文档 将盒子<=>对象
div
事件:事件监听(监听用户是否点击我)
<button></button>
html
body
div
head
title
meta
js:
html
|
body。 head
| |
div mate title
bom:brower object model
杯子:
body:玻璃
head:铝合金
content:塑料
content:水
属性名,标签,和方法
alert(); //浏览器弹框
2.js特点
1.js是脚本语言
特点:
本身具有逻辑能力和行为能力
>1+1
需要解析执行
2.解释性语言
需要js的解析器解析执行
默认:浏览器中内置js解析器
node:js解析器(运行环境)
3.弱类型语言
Java:强类型语言
int a=10;
a="hello";//报错
js:弱类型语言
var a=10;//number
a="hello";//string
4.从上到下依次执行
优先解析函数的声明,再解析使用var操作符所声明的变量
代码书写:
say()
functioon say(){}
解析顺序:
functioon say(){}
say();
执行顺序:
functioon say(){}
say()
5.大小写敏感
var a=10;
console.log(A); //报错
3.使用
4.基础语法
1.变量的声明
2.注释
3.语句
5.局部变量和全局变量
6.数据类型
4.使用
1.node
node 直接进入,两次ctrl+c 退出
js运行环境:谷歌浏览器内置的js解析器
1.repl环境
r:read读取
e:evel执行/解析
p:print打印
l:loop循环
>
适合短的代码测试,不适合长代码
console.log(10);输出到控制台上
2.命令:
命令执行文件
ls->程序
ls:
node:
path
/opt/node/bin
node index.js
index.js
2.浏览器
js-嵌入>html
1.内联脚本
<script></script>标签
2.外部引入
创建一个外部的脚本文件
.js为后缀名的文件
<script src='外部文件地址'>
注意:外部引入脚本的script标签内部不能再写js代码,
如果写了,解析器会忽略
5.基础语法
1.变量的声明
var a=10;
标识符声明规则:
1.变量名 必须由字母,数字,下划线以及$组成
2.不能以数字开头
3.不能使用关键字和保留字
关键字:在js中具有特殊意义
保留字:即将成为/有可能成为关键字的特殊字符
int a=10;
4.建议使用驼峰式命名
从第二个单词开始首字母大写
声明方式:
1.var
var a;//变量的声明不进行赋值
a=10;//从内存中获取a变量并赋值为10;
var a=20;//变量的声明并赋值
a=30;//变量的声明并赋值
var a=10,b=20,c=30;//同时声明多个变量,使用逗号
2.let
1.使用let声明的变量只在当前作用域块内有效
2.不能使用let重复声明变量。不在同一作用域内,可以重复声明
3.不会对let声明的变量进行解析提升
3.const
1.对于使用const声明的变量,只在当前作用域内有效
2.使用const声明一个常量,一旦声明不可修改
3.当属性值为引用数据类型时,引用地址不变,内容可以变
2.注释
单行注释: //注释内容
多行注释:/*多行注释内容*/
作用:便于维护和管理,代码更具有可读性
嵌套:单行注释可以嵌套,多行注释不可以嵌套
3.语句
每一个语句建议使用分号结尾
6.局部变量和全局变量
1.使用 var操作符并且声明在函数内部-》局部变量
作用域:
var a=10;
全局变量
js的全局作用域内都能使用的变量
局部作用域:
js中函数内部
只要声明在函数内部,并且使用了var操作符的变量即为
局部变量;其他声明为全局变量
2.let
只在当前作用域块内有效
3.const
只在当前作用域块内有效
7.数据类型
typrof(a):测试a变量的数据类型
返回值:undefined
object(null+object)
number
boolean
string
function
返回值类型:string
6种数据类型:
5种基本数据类型(简单数据类型)
1.undefined:未定义
1.var a;
2.var a=undefined;
3.既没有声明也没有赋值的变量
2.null 空引用数据类型
var a=null;
当前变量即将指向一个引用数据类型,但是此时未指向
注意:
undefined派生自null
null==undefined:true
3.number
所有数值类型均为number类型
var a=10;
var a=10.5;
var a=0xa;->10
var a=0x10;->16
var a=010;-->8
NaN:
NOT A NUMBER
var a="hello"/10;// NaN
isNaN(a):
返回a变量是不是不是一个数
isNaN(10):
false:不,他是一个数
true:是。他不是一个数
对于number类型:false
对于非number类型:true
infinity:(number)
无穷大
var a=10/0;//infinity正无穷
var a=-10/0;//-infinity负无穷
isFinite(a):
测试a变量是否为无穷数
true:不是无穷大的数
false:是一个无穷大的数
4.boolean
true
false
5.string
所有使用了""/''包裹的字符,都为string类型
var a='undefined';
var a="null";
var a="10";
json:
json字符串:
[{
"name":"lisi",
"age":20
},{
name:'lisi',
"age":30
}]
``
1种引用数据类型(复杂数据类型)
function say(){}
object:
function
array
math
date
。。。
实例对象:
var student={
name:'lisi',
age:20
}
var student=new Object();
student.name='lisi';
student.age=20;
自有属性/方法:
constructor:构造者
toString():
将当前实例对象转换为字符串
object:[object object]
function(){}:function(){}
[1,2,3]:[1,2,3]
valueOf():
直接输出当前实例对象的value值
7.值传递和引用数据传递
var a=10;
c=a;//从右到左进行赋值
console.log(c);
c=c+1;
console.log(c);//11
console.log(a);//10
基本数据类型在进行值传递时,只是传递值;
引用数据类型在进行值传递时,传递的是引用地址;
var a={
name:'lisi'
}
c=a;
c.name='terry';
console.log(a.name);//terry
console.log(c.name);//terry
8.操作符
算数运算符:
+ +=:
a+b:
1.两个变量均为number类型,直接进行计算
2.其中一个不为number,并且不为string和object,将当前变量转换为number类型之后再进行计算
null+10
3.如果其中一个值为string类型,那么直接进行字符串拼接
4.如果其中一个值为object类型,另一个不为string类型,那么默认调用object中的valueof/tostring()
a>默认调用obj的tostring()
b>如果只重写了tostring,那么调用tostring
c>如果只重写了valueof,调用valueof
d>如果即重写了tostring又重写了valueof,调用valueof
a+=b:a=a+b//a+=1->a=a+1
- -=
* *=
/ /=
% %=
比较运算符:
返回值为boolean类型
>:
a>b:
1.两个均为number,直接比较
2.两个值中只要有一个不为number,将其转换为number类型再进行比较
true>0:true
3.两个值均为字符串类型,不进行数据类型转换,比较字符串的字符编码
"a">"A":true
>=
<
<=
==:
相等
a==b
1.两个均为number,直接比较
2.两个值中只要有一个不为number,将其转换为number类型再进行比较
true>0:true
3.两个值均为字符串类型,不进行数据类型转换,比较字符串的字符编码
"a">"A":true
4.两个值均为引用数据类型,比较引用地址
null==undefined:true
===:
全等
不进行数据类型转换,如果数据类型不同,返回false,如果数据类型相同:
10===11
"10"==="11":字符编码
null===null:true
null===undefined:false
true===false
stu1===stu2:比较引用地址
逻辑运算符:
逻辑与:
&&
同真则真,有假则假
a&&b:
1.如果第一个操作数为null/undefined/0/NaN/""/false,返回第一个操作数
2.如果第一个操作数为其他,返回第二个操作数
逻辑或:
||
有真则真,同假才假
1.如果第一个操作数为null/0/false/""/undefined/NaN,直接返回第二个数
2.如果第一个数为其他,返回第一个数
逻辑非:
!
!!a:将当前变量转换为布尔类型
!a:
先将变量a转换为boolean类型,然后取反
三目运算符:
分支语句:
if(a=1){
console.log("hello")
}else{
console.log("error");
}
--->
a=1?console.log("hello"):console.log("error")
a>b?console.log(a):console.log(b)
一元运算符
+:
+a:
如果a变量为number值,那么直接返回对应的number
如果a变量为其他数据类型,那么将a变量转换为number类型
+10-》10
+null->0
-:
-a
-(-a):将变量a转换为number类型
++:
a++:a=a+1
先操作变量然后再进行自增操作
1.console.log(a);
2.a=a+1
++a:a=a+1
先进行自增操作,然后再进行变量操作
1.a=a+1;
2.console.log(a)
--:
a--:a=a-1
--a:a=a-1
位运算
将变量转换为二进制进行计算,执行效率更高
原码-》反码-〉补码
js中number以64位存储,在进行位运算时,使用32位2进制的数值进行计算
正数的原码=反码=补码
负数:
反码=原码符号为不变,其他位取反
补码=反码+1
9.数据类型转换
null/undefined没有转换函数
number:
Number(a)
10.3:10.3
true:1
false:0
null:0
undefined:NaN
"":0
"hello":NaN
"10.6":10.6
"+10":10
"h10":NaN
"10p":NaN
parseInt(a):
10.3:10
true:NaN
false:NaN
null:NaN
undefined:NaN
"":NaN
"hello":NaN
"10.6"->10.6->10
"+10":10
"h10":NaN
"10s":10
parseFloat(a):
10.3:10.3
true:NaN
false:NaN
null:NaN
undefined:NaN
"":NaN
"hello":NaN
"10.6":10.6
"+10":10
"h10":NaN
"10s":10
+a: Number(a)
-(-a)
*--》number
boolean
null
undefined
string
boolean:
*->boolean
null:false
undefiend:false
number:
0和“”:false
非0和非空:true
Boolean()
!!a
string:
String():
""/''
直接在当前变量外侧加引号
String(null)->"null"
String(undefiend)->"undefiend"
toString(num):
null和undefined没有toString()
+""
10.流程控制语句
1.分支语句
if else:
if(boolean){
true//
}else{
//false
}
if(boolean){
//true
}else if(boolean){
//true
}else if(){
}else{
//默认
}
switch case:
switch(key){
case value:
console.log()
break;
case value2:
console.log();
default:
console.log()
}
break:跳出循环体,不再执行下一次循环
continue:结束本次循环,继续执行下一次循环
2.循环语句
前置条件判断语句:
三要素:
初始条件
结束条件
迭代条件
for(var i=0;i<=5;i++){
循环体
}
死循环:
for(;;){
}
label语句:
name:for(){}
初始条件;
while(结束条件){
//循环体
//迭代条件
}
var i=10;
while(i<=5){
console.log(i);
i++;
}
死循环:
while(true){}
后置条件判断:
循环体至少执行一次
初始条件
do{
循环体
迭代条件
}while(结束条件)
var i=1;
do{
console.log(i);
i++
}while(i<=5);
for in:增强for循环
遍历对象
var stu={
name:'lisi',
age:20
}
for(var key in stu){
key->属性名
stu[key]-->属性值
}
with语句
with(o){
console.log(name);//o.name
}