(01)JavaScript-初识JavaScript

(01)JavaScript-初识JavaScript

1. 什么是JavaScript

JavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。

JavaScript 是一种基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。

运行环境
  • 浏览器
  • nodejs

2. JavaScript的组成部分

2.1 ECMAScript(js标准)

描述了该语言的语法和基本对象,兼容性100%。

  • 注释 单行// 、多行/**/

  • 变量

  • 操作符

  • 流程控制语句

  • 数组

  • 对象

  • 函数

  • 正则表达式

所有的js解释器都可以兼容ECMAScript

2.2 DOM

Document Object Model

文档对象模型,描述处理网页内容的方法和接口。

是针对XML但经过扩展用于HTML的应用程序编程接口。DOM将整个页面映射成一个多节点结构。

// 获取节点
var dom = document.getElementsByTagName(“input”);

var dom = document.getElementById(“input_name”);

dom.onclick = function(){}
2.3 BOM

Browser Object Model

浏览器对象模型,描述与浏览器进行交互的方法和接口。

开发人员可以使用BOM控制浏览器显示的页面以外的部分。弹出新浏览器窗口;移动,缩放,关闭浏览器的功能;提供浏览器详细信息的navigator对象;提供浏览器所加载页面的详细信息的location对象;提供用户显示器分辨率详细信息的screen对象;对cookies的支持;支持XMLHttpRequest,IE中的ActiveXObject自定义对象

  • alert()/prompt()/confirm()

  • setInterval(),setTimeout()

  • XMLHttpRequest

  • Ajax

3. JavaScript

3.1 js解释器

1)浏览器厂商:Firefox(js标准)、IE(js)、Google(js)

2)nodejs【网络编程(http模块)/数据库操作(mysql)/IO文件(file)】

http://nodejs.cn

在nodejs中,没有dom/bom,因此不存在兼容性问题,不能在nodejs中执行任何dom和bom代码

3.2 js特点
  • 解释型语言

  • 弱类型语言

    变量的数据类型取决于值的数据类型

    变量的数据类型可以随时发生改变

    类型细分不明显

    var a ;
    a = 2;		// a的数据类型为number
    a = true;	// a的数据类型为boolean
    
  • 顺序解释执行

  • 既可以作为前端脚本语言,也可以作为后端语言,取决于应用平台(浏览器/操作系统)和使用的框架(dom、jquery/http、mysql、file)

3.3 在网页中使用JavaScript

1)内部JavaScript

编写好HTML,在<head>标签体中添加<script>元素,然后将js代码填写进来即可。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <!-- window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行该方法。当js写在头部是,最好将代码写进该方法 -->
  <script type="text/javascript">
    window.onload=function(){
      alert('hello javascript')
    }
  </script>
</head>
<body>
</body>
</html>

2)外部JavaScript

单独新建一个后缀名为.js的js文件,编写好HTML文件,在<head>标签体内添加<script>元素,使用script标签的src属性将将js文件导入进来。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script type="text/javascript" src="hello.js"></script>
</head>
<body>
</body>
</html>

3)在body和head中使用JavaScript的区别

在body部分中的JavaScript会在页面加载的时候被执行,在head部分中的JavaScript会在被调用的时候才执行。

因为浏览器解析html是从上到下的。如果把JavaScript放在head里的话,则先被解析,但这时候body还没有解析,所以会返回空值。一般都会绑定一个监听,当全部的html文档解析完之后再执行代码

window.onload = function(){
	// 这里放执行的代码
}

一般习惯将JavaScript放在body的最后面,类似last-child。

4)在vi/vim中编写JavaScript

编写后使用node命令执行即可

$ node hello.js
3.4 关键字与保留字

关键字:(在js中有特殊功能)

break	do   try  typeof
case	else	new	var
catch	finally	return	void
continue	for	switch	while
debugger	this	function	with
default	if  throw	instanceof
delete  in

保留字:(将来可能成为关键字)

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	double	implements	protected
volatile	import	public

注意点:

  • 区分大小写

  • 标识符:指变量,函数,属性的名字或者函数的参数。标识符是按照以下规则组合起来的一或多个字符。

    命名规范:

    • 字母,数字,下划线,$组成
    • 只能以字母,下划线,$开头
    • 不能将关键字作为标识符。命名采用驼峰式命名
  • 语句

    每个语句以分号结尾,如果省略分号,由解析器确定语句的结尾,即分号可以省略,但是我们要求每个语句的末尾都应该有分号

3.5 变量

变量是一个值的容器,该容器的值可以随时改变。

定义变量时使用var关键字。

变量的使用:
声明

var message;

初始化

message = "hello"

声明并初始化

var message = "hello";

定义多个变量

var message= "hello",found=false, age = 29;

变量名的命名规则:

  • 变量名由字母,数字,下划线以及$组成。
  • 不要使用下划线或者数字作为变量名的开头
  • 变量名应该具有一定的意义,使用小驼峰命名规则
  • 不要使用关键字或是保留字

变量的使用

// 变量声明
var a ;
// 变量初始化
a = 3;
// 变量调用
console.log(a);

var

var用于声明一个变量,在es6中,可以通过let声明一个变量,通过const声明一个常量

对于var来说

  • 变量可以重复声明

    var a = b = c = 3;
    var d = 10,e = 20,f,g;
    //弱类型语言,变量容器可以混合使用
    var a = "hello world";//变量的重复赋值(相同的数据类型、不同的数据类型)  
    function a(){}
    
  • 变量声明会被提升 (函数的声明也会)

    //console.log(b);//报错  b is not defined
    console.log(a);//不会报错 undefined
    var a = 3;
    //等价于:
    var a;//在所有代码执行之前,js解释器会将js中所有的var声明的变量提升。
    console.log(a);
    a=3;
    
  • var声明的变量的作用域

    案例1

    function foo(){
      if(true){
        var a = 3;  
        console.log("inner",a);//inner 3
      }
      console.log("outer",a);//inner 3  //没有块级作用域
    }
    foo();
    console.log(a);//error!  函数作用域:局部作用域
    // var 的变量声明提前知会提升到当前作用域的最前面
    

    案例2

    //如果在函数中定义变量没有加var,该变量为全局变量
    function test(){
      message = "hello"; 
    }
    test();
    console.log(message); //可以访问
    

    案例3

    //用var操作符定义的变量将成为定义该变量的作用域中的局部变量
    //全局作用域
    function b() {
      a = 10;
      return;
    }
    var a = 1;
    b();
    console.log(a);//10
    

    案例4

    x = 1;//window.x  global.x 全局作用域
    console.log(x); //1
    function y() {
      console.log(x); //undefined
      console.log(this.x);//1
      var x = 2;
      console.log(x); //2
    }
    y();
    console.log(x);//1
    

    案例5

    //函数作用域:局部作用域
    var a = 1;
    function b() {
      a = 10;
      return;
      //a函数声明,提前变量a,将a认为是函数b作用域的变量,具有局部效果
      function a(){}
    } 
    b(); 
    console.log(a); // 1
    
3.6 数据类型

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。

引用数据类型:对象(Object)、数组(Array)、函数(Function)。

注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

3.6.1 JavaScript 拥有动态类型

JavaScript 拥有动态类型。相同的变量可用作不同的类型。

var x;               // x 为 undefined
var x = 5;           // 现在 x 为数字
var x = "John";      // 现在 x 为字符串
3.6.2 字符串 String

字符串是存储字符(比如 “Bill Gates”)的变量。

字符串可以是引号中的任意文本。可以使用单引号或双引号:

var carname="hello JavaScript";
var carname='hello js';

可以在字符串中使用引号,只要不匹配包围字符串的引号即可:

var answer="hello";
var answer="hello 'tom'";
var answer='hello "tom"';

可以使用字符字面量,转义字符
\n 换行 \t 制表 \b 退格
\r 回车 \ 斜杠 ’ 单引号
" 双引号

字符长度可通过length属性获取字符长度

var str = "string";
console.log(str.length);
3.6.3 数字 Number

整数:

  • 十进制 123 由0~9组成

  • 八进制 067 首位为0,其他位有0~7组成

  • 十六进制 0xAF 首位为0x,其他位为09,AF

var num1 = 123;         //不使用小数点来写
var num2 = 067;        //55
var num3 = 0xAF;       //175

浮点数:

该数值中必须包含一个小数点,并且小数点后必须至少有一位数字。浮点数值的最高精度是17位小数

  • 普通浮点数 3.000001

  • 科学计数法 3.141e7 即31410000

非数值:

该数值表示一个本来要返回数值的操作数未返回数据的情况

var a = 10 / "a";	// a为NaN not a number

非数值检测:

​ 判断参数是否“不是数值”,当参数para不是数值的时候返回true

isNaN(NaN);	// true	

数值范围:

由于内存的限制,ECMAScript不能保存世界上所有的数值。

​ ECMAScript能表示的最小数值保存在Number.MIN_VALUE中

​ 能表示的最大的数值保存在Number.MAX_VALUE中。

​ 如果某次计算的结果超过了JavaScript数值范围,将会返回Infinity(正无穷)或者-Infinity(负无穷)

var a = 9/0;   // Infinity
Number.MIN_VALUE   // 5e-324
Number.MAX_VALUE    // 1.7976931348623157e+308

数值范围检测:

使用 isFinite()函数可以判断参数是否在最大值和最小值之间,如果在,返回true

var a = isFinite(9/0);	// false
3.6.4 布尔 Boolean

布尔(逻辑)只能有两个值:true 或 false。

var x=true;
var y=false;
3.6.5 Null

该类型的取值只有一个,即null。null可以表示一个空对象的指针。

如果一个变量准备将来保存对象,可以将该变量初始化null而不是其他,这样可以通过检查null值就可以知道相应的变量是否已经保存了一个对象的引用。

3.6.6 Undefined

Undefined 这个值表示变量不含有值。未定义的。

var a;
console.log(a,typeof a);//undefined 'undefined'
var a = undefined;
console.log(a,typeof a);//undefined 'undefined'

undefined 与null关系:

undefined继承null,所以undefined == null结果为true,但是null表示空对象,undefined表示未定义;

nullundefined用途不同,null可以用来表示一个空对象,但是没有必要把一个变量的值显式设置为undefined。

//null vs undefined
console.log(undefined == null); //true  //undefined派生自null
console.log(undefined === null);//false
if(null == undefined){console.log('相等的')}
if(null === undefined){console.log('完全相等')}
// ==, 等同  的意思, 两边值类型不同的时候,要先进行类型转换为同一类型后,再比较值是否相等。 
// ===,恒等  的意思, 不做类型转换,类型不同的结果一定不等。
// "=="表示只要值相等即可为真,而"==="则要求不仅值相等,而且也要求类型相同。
// 建议:尽量使用严格运算符 ===。因为"=="不严谨,可能会带来一些违反直觉的后果。
3.6.7 引用数据类型-对象Object

对象由键值对组成,通过使用大括号将所有键值对括起来。

var obj = {
	name: 'momo',
	age: 4
}

可以通过点语法或中括号获取对象的属性

dog.name; //momo
dog['age'];	//age 注意引号
3.6.8 引用数据类型-数组Array

数组是一个特殊的对象,包含了多个值,值与值之间使用逗号分隔开,所有的值通过中括号括起来。

var name = ['lisa','mike','tom']

可以通过数组下标获取对应的数据

name[0] // lisa
3.6.9 引用数据类型-函数Function

函数是代码执行单元,用于实现某些特殊的功能。

function sum(a, b) {
  console.log(a + b)
  return a + b;
}
//执行函数
sum(1,2); // 3
3.7 数据存储
3.7.1 基本数据类型引用数据类型在内存中如何存储

基本数据类型

引用数据类型的引用地址保存在栈区,值保存在堆区。

var obj = {
  name: 'lisa'
}
var obj1 = obj; //将对象obj赋值给对象obj1
console.log(obj.name);  //lisa
console.log(obj1.name); //lisa

// 修改obj的name
// 当obj属性name变为"mike"时,obj1属性name也变为"mike"
obj.name = 'mike';
console.log(obj.name);  //mike
console.log(obj1.name); //mike
image-20210926191514894

结论:当栈存放引用类型时,值为对象的地址,obj与obj1指向同一个地址,所以当obj的name值变为“mike”时,obj1也会发生变化

3.7.2 深拷贝与浅拷贝

主要针对于引用数据类型参数说的,浅拷贝表示仅拷贝引用地址,深拷贝表示对于对象的克隆。

实现深拷贝的方法
  • 通过json对象实现深拷贝(JSON.stringify,JSON.parse)
  • Object.assign()拷贝
  • lodash函数库实现深拷贝
  • 递归的方式实现深拷贝
  • 等等
3.8 类型判断
3.8.1 typeof

使用typeof判断数据类型
返回该变量名所指向数据的类型
语法: typeof 变量名
返回值如下:
“undefined” 未定义
“boolean” 布尔类型
“string” 字符串
“number” 数值
“object” 对象或者null或者数组
“function” 函数

通过typeof可以判断一个变量的类型

var a = 3;
typeof a;  // number
if((typeof a) == "string"){}
if(a == "null"){}
if(a == null){}
3.8.2 isNaN

判断是否为一个数字

var a = 10/'a';
isNaN(a);    //true
3.8.3 isFinite

判断是否是一个有效值

var a = 10/0 ;
isFinite(a)   // false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值