JavaScript基础概念

组成

  • ECMAScript:JavaScript语法标准
  • DOM:文档对象模型
  • BOM:浏览器对象模型

特性

  • JavaScript 对大小写是敏感的。
  • JavaScript 使用 Unicode 字符集。

数据

代表了特定的信息
特点:可传递(基本数据被赋值会直接复制一个一模一样的数据),可运算
内存中所有的操作目标都是数据
js调用 函数时传递变量参数时是(看理解)

  1. 都是值(基本/地址值)传递
  2. 可能是值传递,也可能是引用传递(地址值)

内存

内存条 => 通电 => 产生内存空间 => 存储数据 => 处理数据 => 断电 => 内存和数据都消失
内存生命周期

  • 分配内存空间,获得使用权
  • 存储数据,可以反复操作
  • 释放内存空间

释放内存

  • 局部变量:函数执行完自动释放
  • 对象:变成垃圾对象=>垃圾回收器回收

变量

可变化的量,由变量名和变量值组成
每个变量对应一块内存,变量名用来查找内存,变量值就是内存中的数值

数据、变量、内存的关系

内存用来存储数据的空间
变量是内存的标识

基本数据类型(5+2种)

  • 字符串(String)
  • 数字(Number)
  • 布尔(Boolean)
  • 对空(Null)
  • 未定义(Undefined)
  • Symbol(Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。)
  • bigInt(大整数,ES6引入)

注释:

  • 参数赋值传数值
  • null和undefined中没有任何方法
调用方法时的过程

对于str.toUpperCase()

  1. 字符串 str 是一个原始值。因此,在访问其属性时,会创建一个包含字符串字面值的特殊对象,并且具有可用的方法,例如 toUpperCase()。
  2. 该方法运行并返回一个新的字符串(由 alert 显示)。
  3. 特殊对象被销毁,只留下原始值 str。

虽然创建了特殊对象,但是实际上仍比对象类型更加轻量级

引用数据类型

  • 基本
    • 对象(Object)(剩下其他类型都是object)
    • 数组(Array)
    • 函数(Function)
  • 特殊
    • 正则(RegExp)
    • 日期(Date)

注释:

  • 参数赋值传地址
  • JavaScript的对象可以认为是键值对的集合
对象的方法定义
<script>
var person = {
    firstName: "John",
    lastName : "Doe",
    id : 5566,
    //对象方法作为一个函数定义存储在对象属性中。
    fullName : function() {
       return this.firstName + " " + this.lastName;
    }};
document.getElementById("demo").innerHTML = person.fullName();
</script>

基本数据类型和引用数据类型区别

  • 栈内存和堆内存(内存分配)
    • 基本数据类型的值在栈内存中独立存放
    • 引用数据类型的值再堆内存中存档,指向改地址的指针存放在栈内存中
  • 访问机制
    • 基本数据类型会直接访问
    • 引用数据对象需要先得到在堆内存中的地址,按照这个地址去获得这个对象
  • 复制变量的不同
    • 基本数据类型复制后是完全独立的
    • 应用数据类型复制后只是多了一个指针,仍然指向一个地址
  • 参数传递不同
    • 基本数据类型只是传了值,新参数和原数据互不影响
    • 应用数据类型传递的是指针,新参数和原数据相互影响

声明变量

当您声明新变量时,可以使用关键词 “new” 来声明其类型:

var carname = new String();
var x = new Number();
var y = new Boolean();
var cars = new Array();
var person = new Object();

向未声明的 JavaScript 变量分配值

如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
这条语句carname="name"将声明 window 的一个属性 carname。
非严格模式下,给未声明变量赋值创建的全局变量,是全局对象的可配置属性,
给未声明变量赋值创建的全局变量可以删除。

var var1 = 1; // 不可配置全局属性 
var2 = 2; // 没有使用 var 声明,可配置全局属性 

运算符

字符串和数字运算结果是字符串 即 '5'+ 5 ='55'

!==

类型和值至少有一个不一样

??空值合并运算符

a??b
如果a不是null或者undefined,则结果为a
如果a是null或者undefined,则结果为b
通常用于提供默认值,例如(user ?? "匿名"
或者用于选出第一个非null/undefined的值,firstName ?? lastName ?? nickName ?? "匿名"

与||的区别

??返回第一个非null和undefined的值
||返回第一个真值,无法区分false,0,“”和null、undefined

基本循环方式

JavaScript 支持不同类型的循环:

  • for - 循环代码块一定的次数
  • for in - 循环遍历对象的属性
  • while - 当指定的条件为 true 时循环指定的代码块
  • do/while - 同样当指定的条件为 true 时循环指定的代码块

for in

<script>
function myFunction(){
	var x;
	var txt="";
	var person={fname:"Bill",lname:"Gates",age:56}; 
	for (x in person){
		txt=txt + person[x];
	}
	document.getElementById("demo").innerHTML=txt;//BillGates56
}
</script>

break 带标签引用

不带标签只可以用在循环或者swtich
带标签可以跳出任何代码块(前提是break在当前代码块内)
但是 continue 不管带不带都不可以

cars=["BMW","Volvo","Saab","Ford"]; 
list: {
  document.write(cars[0] + "<br>"); 
  document.write(cars[1] + "<br>"); 
  document.write(cars[2] + "<br>"); 
  break list; 
  document.write(cars[3] + "<br>"); 
  document.write(cars[4] + "<br>"); 
  document.write(cars[5] + "<br>"); 
}
/*
BMW
Volvo
Saab
*/

switch

case的值可以是表达式或值,可以是’a’、6、true 等任意数据类型的值,也可以是表达式

case 'error':
case age >= 18 && age <= 65:

错误处理方式

try、catch、finally

  • try语句测试代码块错误
  • catch语句处理错误
  • finally语句在try和catch之后,无论是否有异常都会执行
try{
... //异常的抛出
}catch(e){
 ... //异常的捕获与处理}
finally{ 
... //结束处理
}
特点
  • try和catch成对出现
  • 只会检测语法错误
  • 只会检测同步运行的错误
finally

一定会执行的代码

  • try块中有error,在catch后执行finally
  • try块中有return,优先执行finally再return
  • 可以try…finallly,也可以try…catch…finally
  • try块中声明的let,finally中不能用(try块和finally块是独立的)
全局catch

在try…catch语法外的error,会触发

window.onerror = function(message, url, line, col, error) {
  // ...
};
  • **message:**error 信息。
  • **url:**发生 error 的脚本的 URL。
  • **line,col:**发生 error 处的代码的行号和列号。
  • **error:**error 对象。

throw

定义:自定义错误,术语为抛出异常throw exception
异常可以是js字符串、数字、逻辑值、对象,但是最好使用具有name和message属性的对象 保持和内置error的兼容性

let json = '{ "age": 30 }'; // 不完整的数据
try {
  let user = JSON.parse(json); 
  if (!user.name) {
    throw new SyntaxError("数据不全:没有 name"); //抛出
  }
  alert( user.name );
} catch(err) {
  alert( "JSON Error: " + err.message ); // JSON Error: 数据不全:没有 name
}

error

error构造器
  • Error
  • SyntaxError
  • ReferenceError
  • TypeError等
  • 对于内建的 error对象,name 属性刚好就是构造器的名字。message 则来自于参数(argument)。
let error = new Error(message);
let error = new SyntaxError(message);
let error = new ReferenceError(message);
自定义error
class ValidationError extends Error {
  constructor(message) {
    super(message); 
    this.name = "ValidationError";
  }
}
function test() {
  throw new ValidationError("Whoops!");
}
try {
  test();
} catch(err) {
  alert(err.message); // Whoops!
  alert(err.name); // ValidationError
  alert(err.stack); // 一个嵌套调用的列表,每个调用都有对应的行号
}
再次抛出

代码中不一定只有一个error,确保catch只处理知道的error并抛出其他所有error

function readData() {
  let json = '{ "age": 30 }';
  try {
    // ...
    fn(); // error!
  } catch (err) {
    // ...
		// 类型判断 将未知error再次抛出
    if (!(err instanceof SyntaxError)) {
      throw err; 
    }
  }
}
//在外部统一处理所有未知eoor
try {
  readData();
} catch (err) {
  alert( "External catch got: " + err ); // 捕获
}

JavaScript保留关键字

Javascript 的保留关键字不可以用作变量、标签或者函数名。有些保留关键字是作为 Javascript 以后扩展使用。

  • 标记的关键字是 ES5 中新添加的。
abstractargumentsbooleanbreakbyte
casecatchcharclass*const
continuedebuggerdefaultdeletedo
doubleelseenum*evalexport*
extends*falsefinalfinallyfloat
forfunctiongotoifimplements
import*ininstanceofintinterface
letlongnativenewnull
packageprivateprotectedpublicreturn
shortstaticsuper*switchsynchronized
thisthrowthrowstransienttrue
trytypeofvarvoidvolatile
whilewithyield

对象、属性和方法名

您也应该避免使用 JavaScript 内置的对象、属性和方法的名称作为 Javascript 的变量或函数名:

ArrayDateevalfunctionhasOwnProperty
InfinityisFiniteisNaNisPrototypeOflength
MathNaNnameNumberObject
prototypeStringtoStringundefinedvalueOf

Java 保留关键字

JavaScript 经常与 Java 一起使用。您应该避免使用一些 Java 对象和属性作为 JavaScript 标识符:

getClassjavaJavaArrayjavaClassJavaObjectJavaPackage

Windows 保留关键字

JavaScript 可以在 HTML 外部使用。它可在许多其他应用程序中作为编程语言使用。
在 HTML 中,您必须(为了可移植性,您也应该这么做)避免使用 HTML 和 Windows 对象和属性的名称作为 Javascript 的变量及函数名:

alertallanchoranchorsarea
assignblurbuttoncheckboxclearInterval
clearTimeoutclientInformationcloseclosedconfirm
constructorcryptodecodeURIdecodeURIComponentdefaultStatus
documentelementelementsembedembeds
encodeURIencodeURIComponentescapeeventfileUpload
focusformformsframeinnerHeight
innerWidthlayerlayerslinklocation
mimeTypesnavigatenavigatorframesframeRate
hiddenhistoryimageimagesoffscreenBuffering
openopeneroptionouterHeightouterWidth
packagespageXOffsetpageYOffsetparentparseFloat
parseIntpasswordpkcs11pluginprompt
propertyIsEnumradioresetscreenXscreenY
scrollsecureselectselfsetInterval
setTimeoutstatussubmittainttext
textareatopunescapeuntaintwindow

HTML 事件句柄

除此之外,您还应该避免使用 HTML 事件句柄的名称作为 Javascript 的变量及函数名。

onbluronclickonerroronfocus
onkeydownonkeypressonkeyuponmouseover
onloadonmouseuponmousedownonsubmit

严格模式 use strict

目的是指定代码在严格条件下执行
严格模式不能使用未声明的变量

  • 不允许使用未声明的变量和对象(对象也是一个变量)
  • 不允许删除变量或对象(delete x;//报错)
  • 不允许删除函数
  • 不允许变量重名
  • 不允许八进制
  • 不允许转义字符
  • 不允许对只读属性赋值
  • 不允许对getter方法读取的属性赋值
  • 不允许删除不允许删除的属性(delete object.prototype)
  • 变量名不能为eval、arguments
  • 作用域eval创建的变量不能调用
  • 禁止this指向全局对象(因此构造函数没加new时,会直接报错而不是指向全局对象)
  • **新增保留字:**implements、interface、let、package、private、protected、public、static、yield

他不是一条语句 是一个字面量表达式
能且只能在脚本或者函数头部添加"use strict";

使用原因

  • 消除代码不安全之处 保证代码安全运行
  • 提高编译器效率和运行速度
  • 为新版本js做铺垫

声明提升

即解释器会将变量和函数的声明提升到函数的最顶部

变量

//只有声明会被提升,赋值不会
var x =10
console.log(x)//10

console.log(y)//undefined
var y =10

//即
var z
console.log(z)//undefined
z=10

函数

console.log(fn1)//ƒ fn1(){}
function fn1(){}

//函数表达式创建的函数不会被声明提前
//此时提前声明的是fn2变量,为undefined,且未赋值
console.log(fn2)//undefined
var fn2 = function(){}
console.log(fn2)//ƒ (){}

代码规范

  • 变量名:驼峰
  • 空格与运算符:运算符 ( = + - * / ) 前后需要添加空格:
  • 代码缩进:
    • 通常使用 4 个空格符号来缩进代码块:
    • 不推荐使用 TAB 键来缩进,因为不同编辑器 TAB 键的解析不一样。
  • 语句规则
    • 将左花括号放在第一行的结尾。
    • 左花括号前添加一空格。
    • 将右花括号独立放在一行。
    • 不要以分号结束一个复杂的声明。
  • 对象定义的规则:
    • 将左花括号与类名放在同一行。
    • 冒号与属性值间有个空格。
    • 字符串使用双引号,数字不需要。
    • 最后一个属性-值对后面不要添加逗号。
    • 将右花括号独立放在一行,并以分号作为结束符号。
  • 代码注释
/**
 * 返回 x 的 n 次幂的值。
 *
 * @param {number} x 要改变的值。
 * @param {number} n 幂数,必须是一个自然数。
 * @return {number} x 的 n 次幂的值。
 */
function pow(x, n) {
  ...
}

输入输出

输入

  • var str = prompt('请输入你的数据')
  • let a = readline();

输出

  • 使用 window.alert() 弹出警告框。
  • 使用 document.write() 方法将内容写到 HTML 文档中。
    • 应当仅仅向文档输出写内容
    • 如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖。
    • 文档在加载的过程中实际是一边加载一边用 document.write 写出内容到屏幕上,而加载完成后,document 就关闭。如果再调用 document.write 往网页上写内容的话,就会整个重写 document。
  • 使用 innerHTML 写入到 HTML 元素。document.querySelector("").innerHTML = value
  • 使用 console.log()写入到浏览器的控制台。

代码调试

  • console.log():调试窗口上打印值 f12
  • 设置断点:在每个断点上都会停止执行代码
    • 调试工具点击代码左侧
    • debugger停止执行js,并调用调试函数,和在调试工具中设置断点的效果一样debugger;
    • 下一步:f9
    • 跨步:运行下一条指令,但 不会进入到一个函数中,快捷键 F10。
    • 步入:快捷键 F11。和“下一步(Step)”类似,但在异步函数调用情况下表现不同。如果你刚刚才开始学 JavaScript,那么你可以先忽略此差异,因为我们还没有用到异步调用。
    • 步出:继续执行到当前函数的末尾,快捷键 Shift+F11。
  • chrome snippets:chrome-F12-Sourse-Snippets可以再次写小小代码片段 右键文件名-run可执行代码

使用误区

  • 赋值语句返回变量值
if(x=0)//false
if(x=10)//true
  • swtich语句匹配要求===:即“10”和10 不可
  • 字符串分行:直接分行报错,需要使用\
var x =" x \
x"
  • 数组使用名字作为索引:使用名字作为索引后,数组转变为对象,不可以使用对象的方法
a["name"]="zdn"
var x = a.length//返回0
var y = a[0]//返回undefined
  • 定义对象和数组元素最后不可以加逗号:a=[1,2,]//错误

基础实例

基础 JavaScript 实例

JavaScript 语句、注释和代码块

JavaScript 变量

JavaScript 条件语句 If … Else

JavaScript 消息框

JavaScript 函数

JavaScript 循环

JavaScript 事件

JavaScript 错误处理

高级 JavaScript 实例

JavaScript 应用实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值