JS七种数据类型
- number 数字 2. String 字符串 3. null 空 4. undefined 空 5. bool 布尔值 6. symbol 符号 7. Object
概念:
- 闭包、原型 2. 类、继承 3. MVC、Flux 4. 高阶函数 5. 前端工程化
内存图与JS世界
一切都在内存里运行
浏览器的功能
发起请求 下载HTML,解析HTM,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS等。
功能模块: 用户界面、渲染引擎、JS引擎、储存等@!
功能模块一般处于不同的线程(比进程更小),如果进程是轴,那么线程就是车间里的流水线。
JS引擎
chrome用的是V8引擎,c++缩写
网景用的是SpiderMonkey,后被Firefox使用,C++
Safari用的是JavaScriptCore
IE用的是Chakra(JScript9)
Edge用的是chakra(Jscript-javascript)
功能:
- 编译: 把JS代码翻译为机器能执行的字节码或者机器码
- 优化: 改写代码,实其代码更高效
- 执行: 执行上面的字节码或者机器码
- 垃圾回收: 把JS用完的内存回收,更方便之后再次使用。
执行js代码
准备工作:
♥1. 提供API: window / document/ setTimeout
这些东西都不是JS自身具备的功能,我们将这些功能称为运行环境runtime.env,一旦把JS放进页面,就开始执行JS
JS代码在哪里运行呢???
答: JS代码在内存里运行。
| 红色区 |
系统 | 进程 | 渲染线程 | 不知道什么区 | Stack栈 | Heap堆 |
---|---|---|---|---|---|
OS | chrome | 用户界面 | a | ||
辅助进程 | JS引擎 | b | 连续储存 | 随机储存 | |
Tab1 | 代码区 var a =1 | c | |||
Tab2 | var b =1 |
红色区 Stack 栈 和 Heap堆
为什么叫 Stack栈 和 Heap堆呢?
Stack栈的特点: 每个数据顺序存放
Heap堆的特点: 每个数据随机存放
Stack和 Heap 举例
var a = 1
var b = 1
var person = { name: 'frank', child: {name: 'jack'}}
var person2 = person
规律:
数据分为两种: 非对象和对象
非对象存放在Stack栈中 对象存放在Heap堆中
二号总是把右边的东西复制给左边,不存在上面传值和地址。
对象:数组、函数是对象
非对象: 数字、字符串、布尔值不是对象
原型图:

JS版本:
ES6是最低要求。
历史版本:
- ES3,IE6 支持总体评价--垃圾
- ES5,总体评价还是--垃圾
- ES6,大部分浏览器支持,一部分垃圾,一部分好
- ES2019 与 ES6差别不大
为什么说ES6一半垃圾,一半好呢。
答:因为ES6不能删除以前的特性,要兼容旧网站,也就是说以前运行的网站,以后也要运行。
JS 语法
表达式、语句
- 表达式: 1+2 的表达式的值 为 3 add(1,2) 表达式的值是函数的返回值
- console.log 表达式的值是函数本身
- console.log(2), 表达式的值 为undefined , 打印出来的东西为2
1. 语句 var a = 1 是一个语句
两者的区别:
- 表达式一般都有值,语句可能有也可能没有
- 语句一般会改变环境 声明,赋值
- 上面的两句话不是绝对的
大小写要敏感
- var a 和 var A 是不一样的
- object 和 Object 是不用的
- function 和 Function 是不同的
空格: 大部分空格是没有实际意义的
var a=1 和 var a= 1 是没区别的
只有 return 后面加空格会有影响的
标识符
- 第一个字符,可以是Unicode字母或者$或者_或者中文 不能以数字开头
- 后面的字符,除了上面说的,还可以是 数字
变量名是标识符
var _ = 1
var $ = 1
var ______ = 6
var 你好 = 'hi'
// 还有其他的标识符用到在说
注释的分类
- 不好的注释:把代码翻译成中文,过时的注释,发泄不满的注释
- 好的注释:踩坑的注释警告大家,遇到什么BUG的解决办法的注释
区块block
把代码打包: {
let a = 1
let b = 2
}
常常与if/ for / while 合用
if语句: 如果...那么...
语法:
if(表达式){
语句1
}else {
语句2
}
// {} 在语句只有一句的时候可以省略,不建议这么写
变态情况
a = 2
if(a === 2) {
console.log('a')
console.log('a等于2')
}
// undefined
推荐的if写法
if(表达式){
语句1
}else if(表达式){
语句2
}else {
语句3
}
switch 语句
switch (fruit) {
case 'banana'
break;
case 'apple'
break;
default;
}
问号冒号表达式
条件?表达式1:表达式2
如果条件为真返回表达式1,假返回2
function max(a,b) {
return a>b? a : b
} // 如果 a大于b 那么就返回a 否则返回 b
&& 短路运算符
&& : A&&b
B | B | ||
---|---|---|---|
&& | 真 | 假 | |
A | 真 | B | B |
A | 假 | A | A |
第一个为真,则返回第二个值
第一个为假,则返回第一个值
|| 短路运算符
||: A||B
B | B | ||
---|---|---|---|
|| | 真 | 假 | |
A | 真 | A | A |
A | 假 | B | B |
第一个值为真,则返回第一个值
第一个值为假,则返回第二个值
while循环 当...时...
语法: while(表达式){
语句
}
let a =0;
while(a < 10) {
console.log(a)
a++
} // 先从开始打印到9停止
for 循环
语法糖 for是while 循环的方便写法
语法 for(初始化表达式; 条件; 递增表达式) {
循环体
}
let a = 5;
for(var i = 0; i < a; i++) {
console.log(i)
} // 打印出 0,1,2,3,4 输出的结构是 undefined
先执行初始化表达式,然后判断条件,如果为真执行循环体然后在执行递增表达式
break 和 continue 的区别
break 在 相等的情况下 后面的不执行
continue 在相等的情况下 跳过此环节 执行后面的循环
for(var i=0; i<5; i++){
console.log(i);
if( i ===3){
break; // 等于3的时候停止循环
}
}
for(var i = 0; i < 10; i++) {
if(i === 3 ) {
continue; // i等于3的时候就略过
}
console.log(i)
}
label 代码块
语句:
foo: {
console.log(1);
break foo;
console.log('本行不输出')
}
console.log(2)
// 输出结果是 1 2
{
foo: 1 // 是个对象
foo: 2; // 是个2
}
数据类型和运算符
数字与字符串
数字是数字,字符串是字符串, 要严谨 1 和 '1'是不一样的。
数字能加减乘除,而字符串不行。
字符串可以表示电话号码,数字却不行。
储存的形式不同:js中数字是用64位浮点数的形式存储的。JS中字符串是用类似UTF-8形式村塾的(UCS-2).
JS中的数据类型:
一共七种: 数字 Number 字符串 String 布尔bool 符号 symbol 空 undefined 空 null 对象 Object
四基两空一对象