15.JS基础(一)

上一章我们学完了样式,接下来我们开始学习js,废话不多说,直接进入学习哈!!

JavaScript概述

H5是一种新的技术,就目前而言,我们所知的H5都是一些标签,但是有了JS之后,这些标签深层的扩展功能才得以实现。

JavaScript是什么?

  • JavaScript是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言

  • 直译式:直接编译并执行,代码不进行预编译

  • 脚本:凡是不能独立执行需要依赖其他程序的,通常都叫做脚本

  • HTML文件必须在浏览器里执行,JS文件必须嵌入到HTML文件里才能执行

  • 脚本语言:依附于某个程序来运行,为某个程序提供服务的语言

  • 动态类型:声明一个变量,能够随时改变它的类型

  • 静态类型:声明一个变量,不能改变它的类型

  • 弱类型:允许变量类型的隐式转换,允许强制类型转换(编译时检查很弱)

  • 强类型:变量对象在编译时确定类型,不允许类型的隐式转换(编译时检查严格)

  • 基于原型:原型的主要作用是继承,对象之间的继承,主要是靠原型链接

JavaScript能干什么?

  1. 前端网页开发(Javascript的老本行)
  2. 移动开发 webapp 混合式应用
  3. 网站后端开发(Node.js可以让js在后端运行)
  4. 插件开发(由于js跨平台这一特性,很多插件使用js进行开发,因为一次开发可以保证跨平台使用)
  5. 桌面开发(主要是指chrome浏览器能把js写的程序打包成桌面应用)
  6. 游戏开发 等等。。。

前端网页三剑客(HTML,CSS,JavaScript)

  • Html:负责一个页面的结构(结构层)
  • Css:负责一个页面的样式(样式层)
  • JavaScript:负责与用户交互,加强用户体验(行为层)

js在前端网页中的作用:

  • 校验数据
  • 前后端数据交互
  • 给网页增加动态功能
  • 响应用户操作
  • 加强用户体验 等等。。。

跨平台特性

在这里插入图片描述

跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。

JavaScript简史

  • 90年代 28.8kb/s
  • 1995 网景Netscape2加入LiveScript,改名 JavaScript (布兰登·艾克)
  • Nombas推出ScriptEase
  • 微软在IE3中加入JScript
  • 1997 ECMA TC39 ECMA-262标准 命名ECMAScript
  • JavaScript兼容于ECMA标准,通常也称为ECMAScript
  • JavaScript由三大部分组成:核心部分(ECMA-262)、文档对象模型(DOM)、浏览器对象模型(BOM)
  • ECMA:欧洲计算机制造商协会European Computer Manufacturers Association
  • TC39:ECMA的第39号技术专家委员会(简称TC39)负责制订ECMAScript标准,成员包括Microsoft、Mozilla、Google等大公司

ECMAScript(简称ES)版本名称:

  • 1997年7月,ECMAScript 1.0发布。(ES1)

  • 1998年6月,ECMAScript 2.0版发布。(ES2)

  • 1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。(ES3)

  • 2008年7月ECMAScript 4.0版本比较激进被废弃,替代方案将现有功能小幅度升级发布为ECMAScript 3.1,之后改名为ECMAScript 5,所以各类文章所说的ECMAScript 3.1等同于ECMAScript 5(ES5)

  • 2011年6月,ECMAscript 5.1版发布,到了2012年底,所有主要浏览器都支持ECMAScript 5.1版的全部功能。(ES5)

  • 在这之后,版本发布规则发生变化, 标准委员会决定,标准在每年的6月份正式发布一次,作为当年的正式版本。接下来的时间,就在这个版本的基础上做改动,直到下一年的6月份,草案就自然变成了新一年的版本,只要用年份标记就可以了。

  • 2015年6月发布了ECMAScript 6.0 版本正式名称就是《ECMAScript 2015标准》(简称 ES2015)-> ES6

  • 2016年6月小幅修订的《ECMAScript 2016标准》如期发布(简称 ES2016)-> ES7

  • 2017(简称 ES2017)-> ES8

  • 2018(简称 ES2018)-> ES9

  • 2019(简称 ES2019)-> ES10

  • 2020(简称 ES2020)-> ES11

学习参考文档

  • JavaScript | MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

JS引入运行

内部引入:在html文件中直接写在script标签内部

<script type="text/javascript"> //type属性可以省略
    alert('hello world');
</script>

标签内引入:直接写在标签内

<button onclick="alert('hello world');">按钮</button>

外部引入:在html文件中通过script标签的src属性引入外部js文件

<script src="test.js"></script>

思考:?

<script src="test.js">
    alert('hello world');
</script>

常用调试方法

  1. alert( ) 浏览器弹窗,弹出的内容就是()括号中的内容

  2. console.log( ) 在控制台打印相关信息

  3. document.write( ) 向文档写入字符串、html 或 javascript代码

  • 注意:调试代码应当从最终的产品代码中删除掉

基本语法

  • JavaScript大量借鉴了C类语言的语法,但JS的语法更加宽松
  • JavaScript中的语句以一个分号 ; 结尾(不是硬性要求)
  • JavaScript多条语句组合的代码块,以 { 开头,以 } 结尾
  • JavaScript中的一切都区分大小写 (如 变量名、函数名等)

单行注释:

// 注释内容不可以换行

块级/多行注释:

/* 注释内容   
    可以换行   
    注释代码块 */

说明文档注释:

/**
*   文档说明的注释   
*   用在插件或方法开头   
*   说明参数及返回值等   
*/

养成良好的代码注释习惯,既方便自己也方便他人!!

标识符变量函数属性名函数的参数名(你自己起名字的东西)
标识符命名规范:

  1. 第一个字符必须是字母、下划线 _ 或美元符号 $
  2. 其他字符可以是字母、下划线、美元符号或数字
  3. 不能含有空格
  4. 不能以关键字或保留字命名
  5. 命名的基本原则(非必须):语义化,见名知意
    • 驼峰命名法,userAgeNumber
    • 帕斯卡命名法,UserAgeNumber
    • 下划线命名法,user_age_number
    • 匈牙利命名法,nUserAge,num_UserAge

ECMAScript 关键字

  • ECMA-262 定义了 ECMAScript 支持的一套关键字(keyword)
  • 这些关键字标识了 ECMAScript 语句的开头和/或结尾。根据规定,关键字是保留的,不能用作标识符命名
break        do          try           typeof
case         else        new           instanceof
catch        in          return        var
continue     for         switch        while
function     this        with          default
if           throw       delete        ......

ECMAScript 保留字

  • ECMA-262 定义了 ECMAScript 支持的一套保留字(reserved word)
  • 保留字在某种意思上是为将来的关键字而保留的单词。因此保留字也不能用作标识符命名
abstract     int          short         boolean
export       interface    static        byte
extends      long         super         char
final        native       class         float
throws       const        goto          private
double       import       public        ......

变量

  • 变量是指没有固定的值,可以改变的数,是存储信息的容器
  • 优点:方便使用,统一修改,方便维护

JS是松散类型的语言,变量可以用来保存任何类型的数据

JS中使用关键字 var 来声明变量:

  • 关键字 变量名 赋值 数据
  • var userName = ‘xiaocuo’;
  • 左值:在等号左侧,是变量名
  • 右值:在等号右侧,是存进变量中的数据
  • 引用变量名:document.write( userName )

var声明变量的底层原理:

从本质上看,变量代表了一段可操作的内存,也可以认为变量是内存的符号化表示。当我们使用关键字var声明一个变量的时候,解析器根据变量的数据类型分配一定大小的内存空间。程序就可以通过变量名来访问对应的内存了。

常见错误类型

  • SyntaxError:语法错误,出现语法错误时抛出
  • ReferenceError:引用错误,读取不存在的变量时抛出
  • TypeError:类型错误,值的类型发生错误的时候抛出
  • RangeError:范围错误,数值超出合法范围时抛出

数据类型

简单数据类型(基本类型)

  • 简单数据类型:string、number、boolean、undefined、null

string 类型,值为字符串

  • JS中使用双引号或单引号表示字符串
  • var str1 = ‘123’;
  • var str2 = “abc”;

number 类型,值为数字

  • var num1 = 123;
  • var num2 = 123.45;
  • JS中number类型包括整型、浮点型和非数字值
    • NaN 即非数字值,是number类型中的一个特殊值
    • NaN 用于表示本来要返回一个数值的操作数,结果未能返回数值的情况(‘a’-1) (‘b’-3)
    • NaN有两个特点:(Not a Number)
      1. 任何涉及NAN的操作都会返回NaN
      2. NaN与任何值都不相等,包括它本身
  • isNaN() 判断值是否为NaN,返回布尔值
  • parseInt() 解析一个字符串,并返回一个整数
  • parseFloat() 解析一个字符串,并返回一个浮点数
  • Number.toFixed(n) 方法可把 Number 四舍五入保留n位小数,返回字符串

boolean 类型,值为布尔值

  • boolean类型有两个值 : true 和 false

undefined 类型,表示值未定义

  • undefined类型只有一个特殊值为 : undefined
  • var und;
  • 声明变量未赋值,这个变量的值就是undefined

null 类型,表示空

  • null类型只有一个特殊值为 : null
  • 如果变量准备在将来用于保存一个对象,那么该变量最好初始化为null

复杂数据类型(引用类型)

  • 复杂数据类型:只有一种 object 类型
  • object 类型,值为对象类型
  • JS中 { } 表示对象,[ ] 表示数组,function 表示函数 他们都属于对象类型
    • var obj1 = [1,2,3];
    • var obj2 = {‘name’: ‘laowang’};
    • var obj3 = function () { };

运算符

typeof 运算符

  • typeof 操作符返回一个用来表示数据类型的字符串

  • 使用 typeof 操作符将会返回下列七个字符串之一:

    console.log( typeof x )
    

    typeof与后面的变量要有 空格 隔开

    • ‘undefined’ — 值为定义
    • ‘boolean’ — 值是布尔值
    • ‘string’ — 值是字符串
    • ‘number’ — 值是数值
    • ‘object’ — 值是对象、数组或null
    • ‘function’ — 值是函数
    • ‘Symbol’ — 值是Symbol类型

逗号运算符

  • 使用逗号运算符可以在一条语句中执行多个操作,如:
    • var a = 1, b = 2, c = 3;
  • 返回整体的最后一个值
    • console.log( (a,b,c) ); //c

赋值运算符

= += -= *= /= %=

  • JS中的 ‘=’ 号并非数学计算中的’='号,而是赋值运算符
  • 如:a = 5,应该理解为,把5这个值,赋值给变量 a
    • var a = 1;
    • a += 5 --> a = a + 5;
    • console.log(a); // 6

算术运算符

+加 -减 *乘 /除 %取余

  • console.log(0/3); // 0

  • console.log(3/0); // Infinity

  • % 取余(求模),5%3 即 5对3取余 或 5模3

5%3 --> 2
9%3 --> 0

2%7 --> 2              7%4 --> 3
(-2)%7 --> -2          (-7)%4 --> -3
2%(-7) --> 2           (7)%(-4) --> 3
(-2)%(-7) --> -2       (-7)%(-4) --> -3
// 不考虑正负号,小的数模大的数,余小的数
// 余数的正负号,取决于第一个数的正负号

递增和递减运算符

  • ++ 表示值递增加1
  • – 表示值递减减1
  • i++ 加加后置,先返回原始值,再递增+1
  • ++i 加加前置,先递增+1,再返回递增之后的值
  • 前置和后置的区别:在同一行才有区别,如果不在同一行,前置和后置都是加1,没啥区别
var i = 0;
++i 表示先递增,后取值
i++ 表示先取值,后递增

思考:?
var i = 4, v;
v = i++;
i = ++i;
alert(v);//4
alert(i);//6

var k = 0;
console.log(k++ + ++k + k * 2 + k++);//8
console.log(k);//3

关系运算符

> < == === >= <= != !==

  • 关系运算符返回布尔值
  • 等于 == 只比较值是否相等(忽略类型)
  • 全等 === 先比较类型(内存地址),再比较值
  • 两个数字 --> 正常比较大小

  • 两个字符串 --> 正常比较,比较字符的ASCII码值,

    ‘0’ – 48,‘A’ – 65,‘a’ – 97

  • 一个数字与一个纯数字字符串,该字符串自动转成数字,再进行比较

    console.log(2 == '2')
    console.log( 2 == Number('2') ) //隐式类型转换
    
  • 一个数字与一个非纯数字字符串,不能正常比较,返回 false

    console.log( 2 == Number('2px') )
    
    Number('2px') -> NaN
    
    console.log( 2 == NaN )//false
    

三元运算符(三目运算符)

Boolean ? express1 : express2;

  • 当Boolean为true时,执行express1并返回值
  • 当Boolean为false时,执行express2并返回值
var str = 3 > 4 ? 'aaa' : 'bbb';
document.write(str);

优点:代码少
缺点:不方便阅读和维护

逻辑运算符

  • 逻辑运算符返回布尔值
    • && 逻辑与,&&前后均为true才会返回true
    • || 逻辑或,||前后有一个为true就会返回true
    • ! 逻辑非,!求当前值的布尔值并取反
var res1 = true && false;//false
var res2 = false || true;//true
var res3 = !true;//false
  • 短路操作
var a = 2, b = 3;
(a < b) && (a = 5);
alert(a);//5

var a = 4, b = 3;
(a < b) && (a = 5);  //逻辑与,左边为false时不会再执行右边的代码
alert(a);//undefined

var a = 2, b = 3;
(a < b) || (a = 5);
alert(a);//undefined 逻辑或,左边为true时不会再执行右边的代码

var a = 4, b = 3;
(a < b) || (a = 5);
alert(a);//5

进制转换

  • 进制也就是进位计数制,是人为定义的带进位的计数方法

  • 十六进制是逢十六进一,十进制是逢十进一,八进制是逢八进一,二进制就是逢二进一 … 逢进制加一,原位归零

  • 在javaScript中进制之间的转换提供了两个非常好用的方法:toString()、parseInt()。

  • 使用 toString() 方法把十进制转为其他进制:

var  x = 28;// 10进制
console.log(x.toString(2)); //把十进制转为2进制  
console.log(x.toString(8));//把十进制转为8进制  
console.log(x.toString(16));//把十进制转为16进制  
  • 使用 parseInt() 方法把其他进制转为十进制:
  • parseInt() 方法,第一个参数为要转换的字符串,第二个参数指定字符串的进制
var x = "110";//二进制的字符串
console.log(parseInt(x, 2));//把这个字符串当做二进制,转为十进制  

var x = "070";//八进制的字符串
console.log(parseInt(x, 8));//把这个字符串当做八进制,转为十进制  

var x = "0x1c";//十六进制的字符串
console.log(parseInt(x, 16));//把这个字符串当做十六进制,转为十进制  
  • 在javaScript中,八进制以 0 开头,十六进制以 0x 开头,可省略

  • 其他进制的相互转换,先使用parseInt转为十进制,再利用toString变为其他进制

    在js中 0.1 + 0.2 != 0.3 为什么?
    
    1.计算机中存储数字并不是存储十进制,所有数字转成二进制存储或计算
    
    2.计算机在执行0.1+0.2时,会将这些十进制数转成二进制数再计算,然后再转成十进制返回结果
    
    3.计算机存储数据有长度限制
    
    4.二进制小数为数限制为525.js存储数据使用 IEEE754双精度64位 存储
    
    console.log( 0.1+0.2 )// 0.30000000000000004
    
    十进制小数转成二进制:
    
    小数*2 取乘积的整数部分(0 | 1),一直到乘积小数为0时转换结束
    
    0.1 * 2 = 0.2 --> 0
    
    
    
    0.2 * 2 = 0.4 --> 0
    
    0.4 * 2 = 0.8 --> 0
    
    0.8 * 2 = 1.6 --> 1
    
    0.6 * 2 = 1.2 --> 1
    
    
    
    0.2 * 2 = 0.4 --> 0
    
    0.4 * 2 = 0.8 --> 0
    
    0.8 * 2 = 1.6 --> 1
    
    0.6 * 2 = 1.2 --> 1
    
    
    
    0.2 * 2 = 0.4 --> 0
    
    0.4 * 2 = 0.8 --> 0
    
    0.8 * 2 = 1.6 --> 1
    
    0.6 * 2 = 1.2 --> 1
    
    
    
    0.2 * 2 = 0.4 --> 0
    
    0.4 * 2 = 0.8 --> 0
    
    0.8 * 2 = 1.6 --> 1
    
    0.6 * 2 = 1.2 --> 1
    
    
    
    0.2 * 2 = 0.4 --> 0
    
    0.4 * 2 = 0.8 --> 0
    
    0.8 * 2 = 1.6 --> 1
    
    0.6 * 2 = 1.2 --> 1
    
    ...
    
    0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 ...(52)
    
    同理 十进制0.2转成二进制小数位数也是无限多的。。。
    
    两个不是十分精确的数相加 结果也是一个不精确的数
    

运算符优先级

  • 参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

数据类型转换

强制转换(显式转换)

转为字符串

// 数据.toString( )方法,返回字符串值,不可以转null和undefined,会报错
var bool = true;
console.log( bool.toString() ); // 'true'
console.log( (123).toString() ); // '123'

// String( )方法,返回字符串值,所有值都能转
console.log( String(null) ); // 'null'
console.log( String(123) ); // '123'

转为数字

// Number( )方法,将数据转为数字类型
console.log( Number(true) ); // 1
console.log( Number(false) ); // 0
console.log( Number('123') ); // 123
console.log( Number('123a') ); // NaN
  • parseInt( ) 与 parseFloat( ) 方法
    • parseInt( )从左到右检测数据中不为数字的字符,并把之前解析到的数字值返回,如果第一个字符不为数字则返回NaN
    • parseFloat( )与parseInt( )相似,parseInt( )解析整数,parseFloat( )解析浮点数

转为布尔值

// Boolean()方法,将数据转为布尔值
console.log( Boolean(2) ); // true
console.log( Boolean(0) ); // false
console.log( Boolean('abc') ); // true
console.log( Boolean('') ); // false
console.log( Boolean(null) ); // false

任何数据类型转为布尔类型的规则:
undefined、null、0、NaN、''(空字符串)及false本身,这六种数据会被转成false,其它所有数据都会被转成true

自动转换(隐式转换)

// x + y,当 + 两侧有一个是字符串类型,另一个是其它类型的时候,会先把其它类型转换成字符串再进行字符串拼接
console.log('123'+true);
console.log(123+'4');
console.log( 1 + true );
// x - y,当 - 两侧都是纯数字字符串,或者一个是纯数字字符串,一个是数字时,会先把字符串转成数字再进行减法运算
console.log('6'-'2');
console.log('6'-2);
// 还有 * / 与 - 是一样的转换规则:js会找到运算符最适合的类型并转换
// 逻辑运算符 && 、|| 、! 会发生自动类型转换
// !! 两次取反转换,保证了值没有变化,但类型已经被转为布尔值
var str = 'abc';
var bool = !!str;
console.log(bool);
// 关系运算符也会发生自动类型转换
undefined == null ->true ECMA规定的
undefined === null ->false 数据类型不同
number == string,会将string转换为number,再比较
number == boolean,会将boolean转换为number,再比较
// 非正常比较,全部返回false

对话框 prompt

prompt(str1,str2) 弹出可输入的对话框

  • str1: 要显示在消息对话框中的文本
  • str2:文本框中的内容

返回值:

  • 点击确定按钮,文本框中的内容将作为函数的返回值
  • 点击取消按钮,将返回null
  • prompt得到的值都为字符串

下一篇:16.JS基础(二)

🌸友情推荐:全栈大佬笔记     Android领域肥宅

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值