常见浏览器
- webkit内核(v8引擎)
- 谷歌浏览器
- safari
- opera>V14
- 国产浏览器
- 手机浏览器
- ...
- Gecko
- 火狐Firefox
- Presto
- opera<V14
- trident
- IE
- ie edge开始使用双核(包含Chrome迷你内核)
- 什么是浏览器内核?
- 浏览器内核准确翻译是渲染引擎,对网页的语法进行解释,并且进行渲染网页,将网页的代码转化为看得到的页面
谷歌控制台
- 谷歌浏览器控制台
- elements 查看结构样式可以修改这些内容
- Console 查看输出结果和报错信息,是JS调试的利器
- Sources:查看项目源码
- Network:查看当前网站所有资源的请求信息(包括和服务器传输的HTTP报文信息)加载时间(根据加载时间进行项目优化)
- Application:查看当前网站的数据储存和资源文件
JS做客户端语言
按照相关的JS语法,去操作页面中的元素,有时还要操作浏览器里面的一些功能
- ECMAScript js的语法规范(变量、数据类型。、操作语句)
- DOM(document object model)文档对象模型 提供一些js的属性和方法,用来操作页面中的DOM元素
- BOM(browser object model) 浏览器对象模型 提供一些js的属性和方法用来操作浏览器的
js中的变量 variable
变量:可变的量,在编程语言当中,变量其实就是一个名字用来存储和代表不同值的东西
//es3
var a=12;
console.log(a)=>输出的是a代表的值12
//es6
let b=100;
b=200;
const c=1000; 特殊变量常量 const创建的变量储存的指标谁能被修改
//创建函数也相当于在创建变量
function fn(){}
//创建类也香港与创建变量
class A{}
//es6的模块导入也可以创建变量
import B from ‘./B.js’
//Symbol创建唯一值
let a=Symbol(100)
js中的命名规范
- 严格区分大小写
let Test=100;
console.log(text)//=>无法输出,因为第一个字母小写了
- 使用数字、字母、下划线、$,数字不能作为开头
let $box; //-->一般用jq获取的以$开头
let _box;//->一般公共变量都是下划线开头
let 1box;//->不可以 但是可以写box1
let 汉字;//->可以是可以但是不推荐使用汉字
- 使用驼峰命名法 首字母小写,其余每一个有意义的单词的首字母都要大写(命名尽可能语义化明显,使用英文单词)
let studentInfomation;
let studentInfo;
//常用的缩写add/insert/create/new(新增)/update(修改)/delete/del、remove/rm(删除)/sel/select/query/get(查询)/info(信息)
- 不能使用关键字和保留字
当下又特殊含义的是关键字,未来可能会成为关键字的叫保留字
关键字和保留字
- 关键字
break | else | new | var | case |
---|---|---|---|---|
finally | return | void | catch | for |
switch | while | continue | function | this |
with | default | if | throw | delete |
in | try | do | instranceof | typeof |
- 保留字
| abstract | enum | int | short | boolean |
| export |interface | static | byte | extends |
| long | super | char | final | native |
| synchronized | class | float | package | throws |
| const | goto | private | transient | debugger |
|implements| protected | volatile | double | import |
|public| | | | |
js中常用的数据类型
- 基本数据类型
- 数字number 常规数字和NaN
- 字符串string 所有单引号、双引号、反引号包起来的都是字符串
- 布尔Boolean true/false
- 空对象指针null
- 未定义undefinedd(js独有其他语言都没有)
- 引用数据类型
- 对象数据类型object
- {}普通对象
- []数组对象
- /^$/正则对象
- Math数学函数对象
- 日期对象
- 函数数据类型function
- 对象数据类型object
number数字类型
包含:常规数字、NaN
- NaN
not a number:不是一个数 但他隶属于数字类类型
- NaN和任何值(包括自己)都不相等:NaN=!NaN,所以我们不能用相等的方式判断是否为有效数字
- isNaN检测是否为数字类型
检测一个值是否为非有效数字,如果不是有效数字返回true,反之是有效数字返回false 语法:isNaN([val]) 再用isNaN进行检测的时候,首先会验证检测的值是否为数字类型,如果发现这个值不是数字类型的,首先会把这个值转化为数字类型,然后再来验证是够为有效数字
把其他类型值转化为数字类型
- Number([val])
把字符串转化为数字,只要字符串中包含任意一个非有效数字字符(第一个点除外)结果都是NaN,空字符串会变成数字0
console.log(Number('12.5'))//12.5
console.log(Number('12.5px'))//NaN
console.log(Number(''))//0
console.log(Number(' '))//0
//布尔值转化为数字
console.log(Number(true))//1
console.log(Number(false))//0
//null--0 undefined--NaN
console.log(Number(null))//0
console.log(Number(undefined))//NaN
//把引用数据类型转化为数字,是先把他们基于toString方法转化为字符串,然后再转化为数字
//{}/{xxx:'xxx'}.toString---'[object object]'---NaN
console.log(Number({name:'xxx'}))//NaN
console.log(Number({}))//NaN
//[].toString---''/[12].toString---'12'/[12,23].toString---'12,23'
console.log(Number([]))//0
console.log(Number([12]))//12
console.log(Number([12,23]))//NaN
console.log(Number(['10']))//10
- parseInt(Int整数)
parseInt([val],[进制]) - parseFloat(float小数)
parseFloat([val],[进制])
两者都是转化数字的方法,对于字符串来说它是从左到右一次查找有效数字字符,直到遇到非有效数字字符,停止查找(不管后面是否还有数字,都不在找了) - ==
进行比较的时候,可能要出现把其他类型转化为数字 - Number处理类型转化的时候走的是引擎的底层机制 parseInt和parseFloat走的是另外的机制(不是字符串类型的转化为字符串)
string字符串类型
所有用单引号、双引号、反引号包含起来的都是字符串
- 把其他类型转化为字符串
- [val].toString()
null和undefined是禁止直接使用toString方法的,但是转化为字符串就是‘null’/'undefined'
其他情况下别的类型转化为字符串就是在外面包裹一层引号
对象的类型除外{name:'xxx'}.toString()---'[object object]'原因是objectprototype.toString方法不是转换为字符串的,而是用来检测数据类型的
- 字符串拼接
四则运算法则中除加法之外,其余都是数学计算 只有加法可能存在字符串拼接(一旦遇到字符串,则不是数学运算,而是字符串拼接)
//加号遇到字符串就是拼接
//10+0+1+0+NaN+‘孟洋’+0+0+10+0
let a=10+null+true+[]+undefined+'孟洋'+null+[]+10+false
a等于什么?
/**
* 10+null--10+0--10
* 10+true--10+1--11
* 11+[]--空数组转化为对象先变成空字符串,遇到字符串就变成字符串拼接了就不是数字运算了--11+''----‘11’
* ‘11+undefined’----‘11undefined’
* ‘11undefined孟洋’---
* ‘11undefined孟洋’+null-----'11undefined孟洋null'
* '11undefined孟洋null'+[]--'11undefined孟洋null'+'--'11undefined孟洋null'
* '11undefined孟洋null'+10---'11undefined孟洋null10'
* '11undefined孟洋null10'+false----'11undefined孟洋null10false'
*/
Boolean布尔类型
只有两个值 true/false
- 把其他类型值转化为布尔类型
只有0、NaN、null、undefined、空字符串五个之转化完成false 其余的都转化为true(没有任何的特殊情况)
- Boolean([val])
- !/!!
取反(先转换为布尔,然后取反) - 条件判断
if(1){
console.log('哈哈')
}
null/undefined
null和undefined都代表的是没有
null:意料之中(一般都是开始不知道值,我们手动先设置为null,后期再给予赋值操作)
let num=null;//let num=0;一般最好用null作为初始的空值,因为零不是空值,它在占内存中有自己的存在空间(占了个位置)
undefined:意料之外(不是我能决定的)
let num;//创建一个变量没有赋值 默认值是undefined
object对象数据类型-普通对象
{[key]:[value],....}任何一个对象都是由零到多组键值对(属性名:属性值)组成的(并且属性名不能重复,重复的话后面的值覆盖前面的 后面的属性名消失)
获取属性名对应的属性值 对象.属性名/对象['属性名'] 属性名是数字或者字符串格式的
如果当前属性名不存在,默认的属性值是undefined 属性名是数字 则不能使用点的方式获取属性值
删除属性 真删除和假删除 真删除是属性彻底干掉 属性还在 值为空 delete person[1];属性彻底删除 person.weight=null 属性还在 值为空
Array数组是特殊的对象数据类型
- 我们中括号[]中设置的是属性值,他的属性名是默认生成的数字,从0开始递增,而且这个数字代表每一项的位置,我们把其称之为‘索引’---从0开始 连续递增 代表每一项位置的数字属性名
- 天生默认一个属性名length,储存数组的长度
let a=12;
let b=a;
b=13;
console.log(a);//12
let n={
name:'mengyang'
}
let m=n;
m.name='yuanyuan'
clonsole.log(n.name);//‘yuanyuan’
数据类型的区别(堆栈底层机制)
浏览器想要执行js代码:
1.从电脑内存中分配出来一块内存,用来执行代码(栈内存--Stack)
2.分配一个主线程用来自上而下执行js代码---分配一个栈内存
3.栈内存中又分为一个变量储存空间 一个值储存空间
4.主线程中自上而下开始进栈执行---let a=12;共经历两步1创建变量a,放到当前栈内存变量储存区域中
2创建一个值12 把它储存到当前栈内存值区域中(简单的基本类型值是这样储存的,复杂的引用类型值不是这样做的)
3 =为赋值,其实赋值是让变量和值相互关联的过程
5.执行出栈执行完出栈,下一行代码才能进栈执行
6.复杂值(引用类型)的储存,又分为三个步骤:
1.在内存中分配出一快新的内存,用来储存引用类型值(堆内存--heap)--》内存有一个16进制地址
2.把对象中的键值对依次存储到堆内存当中
3.把堆内存地址和变量关联起来
7.基本类型:按值操作(直接操作的是值)所以也叫作值类型。引用类型:操作的是堆内存的地址(按引用地址操作的)所以也叫作引用类型
练习题
let n=[10,20]
let m=n
let x=m
m[0]=100
x=[30,40]
x[0]=200
m=x
m[1]=300
n[2]=400
console.log(n,m,x) //[100, 20, 400] (2) [200, 300] (2) [200, 300]
~~~
~~~
let a={
n:1
}
let b=a
a.x=a={
n:2
}
console.log(a.x)
console.log(b)
//浏览器常用的输出方式除了console.log还有什么?
console.log()输出信息
console.dir()输出一个对象的详细信息
window.alert()警告框
window.prompt()提示框 根据提示让用户输入信息并返回
document.write()在页面中展示输出的内容
window.confirm()确认框 返回用户操作的布尔值
console.error()输出错误信息
//<script>标签放到页面头部和尾部的区别以及解决方法?
var a='abc'+123+456;//'abc123456'
var b='456'-'123';//456-123=333
var c=100+true+21.2+null+undefined+'Tencent'+[]+null+9+false;
console.log(a,b,c)
/**
* 100+1--101
* 101+21.2---122.2
* 122.2+0---122.2
* 122.2+undefined---122.2+NaN---NaN
* NaN+‘Tencent’----'NaNTencent'+''+'null'+'9'+'false'
* 'NaNTencentnull9false'
*/
js中的数据类型检测
- typeof[val] (是运算符不是方法就像是1+1中的加号)用来检测数据类型的运算符
- 基于typeof检测出来的结果
- 首先是一个字符串
- 字符串中包含对应的类型
- 具有局限性 typeof null-->'object' 但是null并不是对象
- typeof undefined --->'undefined'
- typeof []/{}/正则/^$/ -->全都是'object' 不能准确的分类
- typeof function(){}--->'function'
- 基于typeof无法细分出当前值是普通对象还是数组对象,因为只要是对象数据类型,返回的结果都是'object'
- instanceof:用来检测当前实力是否隶属于某个类
- constructor:基于构造函数检测属于类型(也是基于类的方式)
- Object.prototype.toString.call():检测数据类型最好的方法
js中的操作语句:判断、循环
-
判断
-
if/else
if(条件){ 条件成立执行 }else if(条件2){ 条件2成立执行 }else{ 以上条件都不成立 }
-
三元运算符
三元运算符是简单的if/else的特殊处理方式 条件?条件成立处理的事情:不成立处理的事情 1. 如果处理的事情比较多,我们用括号包起来,每一件事情用逗号分隔 2. 如果不需要处理事情,可以使用null/undefined占位
-
switch case
- 每一种case情况结束后,最好都加上break
- 不加break,当前条件成立执行完成后,后面条件不论是否成立都要执行,知道遇到break为止(不加break可以实现变量在某些值的情况下做相同的事情)
- default等价于else,以上都不成立干的事情
- 每一种case情况的比较用的都是=== ‘绝对相等’
-
-
循环
重复做某些事情就是循环
-
for循环
1. 创建循环初始值 2. 设置(验证)循环执行的条件 3. 条件成立执行循环体中的内容 4. 当前循环结束执行步长累计操作 for(var i=0;i<5;i++){ console.log(i) } //循环体中的两个关键词 5. continue:结束当前这轮循环(continue后面的代码不执行),继续执行下一轮循环 6. break:强制结束整个循环(break后面代码也不在执行),而且整个循环啥也不干直接结束
-
for in循环
-
for of循环
-
while循环
-
do while循环
-
元素对象
- 基于.dir可以看到一个对象的详细信息
- id:操作元素的id值
- className:操作元素的class样式类的值
- innerHTML:操作的元素的内容(可以识别标签)
- innerText:和innerHTML的区别是不能识别标签
- tagName:获取元素的标签名(一般大写)
- style:操作元素的行内样式 属性值是一个新的对象 (CSSStyleDeclaretion)
函数function
函数就是一个方法或者一个功能体,函数就是把实现某个功能的代码放到一起进行封装,以后想要操作实现这个功能,只需要把函数执行即可---->>封装:减少页面中的冗余代码,提高代码重复使用率(低耦合高内聚)
洗衣机就是一个函数,生产洗衣机就是封装一个函数(把视线某些工呢过的代码封装进来),生产的时候,不知道用户洗衣服的时候放什么水、衣服、洗衣液,我们需要提供出入口(提供的入口在函数中叫做形参,执行的时候放的具体东西在函数中叫做实参),洗完衣服需要能拿出来,洗衣机提供一个出口(在函数中叫做返回值:把函数处理后的结果能够返回给外面用)
- 创建函数
- 形参
- 创建函数的时候我们设置了形参变量,但如果执行的时候病没有给传递对应的实参值,那么形参变量默认的只是undefined
- 返回值
- 为什么要有返回值?因为函数里面的东西外部用不了,想用的话只有返回
- return 返回的一定是值 不是变量
- 函数没有return返回值 默认是undefined
- 使用return不一定是需要返回值 也有可能只是不想让函数继续执行下去
- 形参
- 执行函数
- 实参
- arguments
- 函数底层运行机制
- 匿名函数
- 匿名函数值函数表达式:把一个匿名函数本身作为值赋值给其他东西,这种函数一般不是手动触发执行,而是靠其他程序触发执行(例如:触发某个事件的时候把她执行)
- 匿名函数之自执行函数:创建完一个匿名函数 紧接着把当前函数加小括号执行
- 定时器
==与===
- ==:相等:数据类型不同 先转换为一样的在比较
- ===:绝对相等,必须类型和值都想用才为true
- let i='10'
- i=i+1-->'101'
- i+=1--->'101'
- i++----11
- i++和已上两种不完全一样 他是纯粹的