计算机程序的运行是需要对值操作的,在编程语言中,能够表示操作的值的类型称做数据类型,编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将他赋值给一个变量。变量的值是一个符号名称,可以通过名称获取对值的引用
1.什么是变量?
变量是一个符号名称,可以通过名称获得对值的引,变量首字母必须由字母,下划线,$开始,后续的字符可以是字母、下划线、数字、$,也可以用非英语语言或者数学符号来书写标识符,变量可以赋予不同类型的值。
1.1全局变量
不在任何函数体声明的变量为全局变量,它在js程序中任何地方可见
1.2局部变量
在函数内声明的变量具有函数作用域,并且只在函数内可见
2.什么是数据类型?
能够表示操作的值的类型称做数据类型,js的数据类型分为两类,一种是原始类型和对象类型,也可以分为可变类型和不可变类型
2.1原始类型:数字,字符串,布尔值,null,undefined,symbol
原始类型是不可修改的,比如说修改一个数值的内容本身就说不通,再比如说字符串,字符串是不可变的,可以访问字符串任意的文本,但是js并未提供修改已知字符串的文本内容的方法
2.2对象类型:Object,Array,全局对象,函数
3.什么是对象
普通对象是命名值的无序集合,
1.1.1对象是名/值对的集合,或字符串到值映射的集合
1.1.2 对象是由花括号括起来
1.1.3 属性topic的值是js
1.1.4 属性fat的值是true
1.1.5 右侧花括号表示对象的结束
1.1.6 可以用过.或者[]来访问对象的属性
1.1.7 通过赋值可以创建一个新的属性
var book = {
topic: 'js',
fat:true
}
book.topic;
book.fat;
book.author='jiaojiao'
即使两个对象包含同样的属性和值,它们也是不相等的console.log({}=={});//false
4.什么是数组?
数组是带编号的值的有序组合
var points=[{x:0,y:0},{x:1,y:1}];
var data={
trial:[[1,2],[3,4]],
trial1:[[3,4],[5,6]]
}
console.log([1]==[1]);//false
5.什么是函数?
函数是具有与它关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果,如果函数用来初始化(使用new运算符)一个新对象,我们称之为构造函数。可以通过定义自己的构造函数来定义需要的类, 每个构造函数定义了一类(class)对象---由构造函数初始化的对象组成的集合。类可以看成对象类型的子类型,除了数组,函数,Date,正则表达式,错误(Error)类。
js是一种面向对象的语言,这意味着我们不用全局的定义函数去操作不同类型的值,数据类型本身可以定义方法(method)来使用值,eg:a.sort();
从技术上来讲,只有js拥有方法,然而数字,字符串和布尔值也可以拥有自己的方法,只有null和undefined是无法拥有方法的值
6.js可以自有的进行数据类型的转换
eg:在程序期望使用字符串的地方使用了数字,js自动将数字转为字符串,js在期望使用布尔值的地方使用了非布尔值,js也会进行相应的转换
7.数字
数字分为整型和浮点型,js可以识别16进制,32进制,2进制的数字,浮点型是由整数部分,小数点和小数部分组成
7.1 js中的算术运算
7.1.1 js程序是使用语言本身提供的算术运算符来进行数字运算。这些运算符包括加法运算符(+),减法运算符(-),乘法运算符(*),除法运算符(/),整数求余运算符(%)
7.1.2 js还支持更加复杂的算术运算,这些复杂运算通过作为Math对象的属性来定义的,js支持所有的数学运算
console.log(Math.pow(2,53));//2的53次幂 9007199254740992
console.log(Math.round(0.6));//1 四舍五入
console.log(Math.ceil(0.6));//1 向上取整
console.log(Math.floor(0.6));//0 向下取整
console.log(Math.abs(-5));//5 取绝对值
console.log(Math.max(10,20,100));//100 求最大值
console.log(Math.min(10,20,100));//10 求最小值
console.log(Math.random());//生成一个大于0小于一的随机数
console.log(Math.PI);//π
console.log(Math.E);//自然对数的底数
console.log(Math.sqrt(3));//3的平方根
console.log(Math.pow(3,1/3));//3的立方根
console.log(Math.sin(0));//三角函数
console.log(Math.log(10));//10的自然对数
console.log(Math.exp(3));//e的三次幂
7.3 当数字运算结果超过了js所能表示的数字上限(溢出),结果为无穷大(Infinity),同样的当负数的值超过了js表示的负数范围,结果为负无穷大(-Infinity),任何数除以0 结果是Infinity,任何数除以-0是-Infinity,只有一个结果例外0/0 是NaN,因为0除以0毫无意义
7.4 NaN 是一个非数字值
●他跟任何值都不相等包括他的本身 NaN!==NaN
●可以用isNaN()来判断是否是数字
7.5 负零和正零值是相等的,甚至用严格模式来判断他们是相等的
console.log(0===-0);//true
7.6.js在使用实数时常常只是一个真实值的近似值,js中的数字具有足够的精度,并可以极其近似于0.1,事实上数字不能精确表述的确带来一些问题
let x=0.3-0.2;
let y=0.2-0.1;
console.log(x==y);//false
console.log(x==0.1);//false
console.log(y==0.1);//true
8.日期和时间
可以用new Date()函数来创造日期和时间
let now=new Date();//获取当前的时间
let later=new Date(2022,3,10,00,00,00);//2022年4月10日 00时00分00秒
let poor=later-now;//日期减法:计算时间的毫秒数
console.log(later.getFullYear());//2022
console.log(later.getMonth());//获取月份3 从0开始计算月份,依次类推
console.log(later.getDate());//10号
console.log(later.getHours());//0
console.log(later.getMinutes());//0
console.log(later.getSeconds());//0
9.文本
●js通过用字符串形式来表示文本。
●js字符串和其数组一样,索引值从0开始,字符串它有自己的length
●js字符串有特殊字符,必须在特殊字符前加个转义字符(\)
console.log('You\'ar right ,it can\'t be a quote ');
●字符串的使用
如果将(+)运算符用于数字,表示两个数相加,如果用于字符串,则表示两个字符的连接
●字符串特有的方法
let s='hello , world';
console.log(s.charAt(0));//h 查找第一个字符
console.log(s.charAt(s.length-1));//d 查找最后一个字符
console.log(s.substring(1,4));//ell 查找索引1到4之前的字符,包括索引1,不包括索引4
console.log(s.slice(0,4));//ell 查找索引1到4之前的字符,包括索引1,不包括索引4
console.log(s.slice(-3));//rld 查找最后3个字符
console.log(s.indexOf('l'));//2 字符l首次出现的位置
console.log(s.lastIndexOf('l'));//10 字符l最后一次出现的位置
console.log(s.indexOf('l',3));//在位置3之后首次出现字符l的位置
console.log(s.split(','));//['hello','worlf']将字符串转为数组
console.log(s.replace('h','H'));//全文字符替换
console.log(s.toUpperCase());//字符转为大写
● 可以通过索引值来查找单个字符
let s='hello , world';
s[0];//h
s[1];//e
10正则表达式
11.布尔值
●布尔值表示真或假,true为真,false为假,布尔值通常用于控制结构中,if/else语句,如果布尔值为真则执行第一段逻辑,如果为false执行另一段逻辑,eg:
if(a==4){
b=b+1;
}else{
a=a+1
}
●由于任意js的值都可以转为布尔值,下面这些值会转为false
undefined,null,0,-0,NaN,空字符串(' ')
其他的值都会转为true,包括所有的对象和字符串eg
let obj={};
console.log(obj==null);//false
再比如o不是null 和 undefined 才会执行if后的代码
if(o){};
●运算符'&&'执行了逻辑与‘AND’操作,运算符|| 执行了‘或的操作’,eg
if(x==0&&y==0 || !(z==0)){
//这条语句满足x和y都是零或者z非0
}
12 null和undefined
●null是一种特殊的值,常用来表示空 ,但是typeof null 返回的是object,null可以认为特殊的对象值,表示为空,它可以表示对象,字符串,数字是‘无值’的
●undefined 表明变量没有初始化化,如果一个变量没有给他赋值,这个变量返回的值就是undefined , typeof undefined,返回的也是undefined
●尽管null和undefined是不同的,但是都表示值的空缺,用相等运算符判断它两是相等的,严格相等运算符是不等的
console.log(null==undefined);//true
console.log(null===undefined);//false
●null和undefined没有任何属性和方法
●undefined是系统提供的,null表示程序级的,正常意料之中的空值
13 全局对象
当浏览器加载页面的时候,它将创建一个新的全局对象,并给他一组定义的初始属性,全局对象就是window,如果定义一个全局变量,这个全局变量就是window的属性
全局属性 undefined ,Indinity,NaN
全局函数 isNaN,parseInt(),eval()
构造函数 Date(), RegExp(),String(),Object()和Array()
全局对象 Math()和JSON
14 包装对象
字符串不是对象,但是字符串有自己的属性和方法,是因为字符串值会通过new String()的方式转换成对象,这个对象继承了字符串的属性和方法,同样的数字和布尔值通过Number(),Boolean()构造函数创建一个临时对象,他们的属性和方法都来自这个临时对象,在‘==’情况下,包装对象和原始值是相等的,但在‘===’全等运算符将它们视为不等。
15 不可变得原始值和可变的对象引用
想到了一个概念,深浅拷贝,
浅拷贝是值的拷贝,a变b变,
深拷贝是地址的拷贝,a变b不变
●js中的原始值(undefined,null,布尔值,数字和字符串),它是不可变得,而对象时可变的。
尽管字符串看起来像由字符组成的数组,我们可以通过指定的索引来修改字符串中的字符。实际上,js是禁止这样做的。字符串中所有的方法看上去返回了一个修改后的字符串,实际上反悔了一个新的字符串值
●对象和数组属于可变类型,js可以对其进行修改。
var o={ x:1}//定义一个对象
o.x=2;//修改对象的值
o.y=3;//添加一个对象新的属性
var a=[1,2,3];//数组也是可以修改的
a[0]=100;//更改数组的一个元素
a[4]=200;//给数组新增加一个元素
●对象的比较并非值的比较,即使两个对象包含同样的属性和值,他们也是不相等的
console.log({} == {});//false
console.log([1] == [1]);//false
●对象的比较均是引用比较,而且仅当它们引用一个同一个基对象时,它们才相等,这个案例,是将数组或对象赋值给一个变量,仅仅是赋值的引用,对象本身没有复制一次
let a=[];
let b=a;
b[0]=1;
a[0];
console.log(a===b);//true
●如果你想得到一个对象或者数组的副本,则必须显示的复制对象的每一个属性或数组的每一个元素。eg
let a=['a','b','c'];
let b=[];
for(var i=0;i<a.length;i++){
b[i]=a[i]
}
console.log(a==b)//false
b[0]='100';
console.log(a,b);//["a", "b", "c"] (3) ["100", "b", "c"]
let obj={x:1,y:2,c:3};
let obj1={};
for(key in obj){ obj1[key]=obj[key] }
console.log(obj==obj1);//false
obj.x=222;
console.log(obj,obj1);//{x: 222, y: 2, c: 3} {x: 1, y: 2, c: 3}
16.类型的转换
js中的取值类型非常灵活,我们已经从布尔值看到这一点,当js期望使用一个布尔值时候,你可以提供任意类型值,js将自动的转换成一些值(真值)为true,假值为false.这在其他类型中同样适用,如果js期望使用一个字符串,它把给定的值将转换为字符串,如果js期望是一个数字,他就会把他转换为一个数字(如果转换的毫无意义那就是NaN);
console.log(10+'object');//'10 object'
console.log('4'*'7');//28
let n=1-'x';
console.log(n);//NaN
console.log(n+'object');//'NaNobject'
17.js类型转换
● 由于js可以做灵活的类型转换,因此相等运算符含义灵活多变
注. 一个值转换为另一个值并不意味着两个值的相等,
console.log(null==undefined);//true
console.log('0'==0);//true 在比较之前字符串转换为数字
console.log(0==false);//true 在比较之前布尔值转换为数字
●显示类型转换
console.log(Number(3));//3
console.log(String(false));//'false'
console.log(Boolean([]));//true
console.log(Object(3));//new Number(3)
●js的某些运算符隐式的类型转换
'+'运算符一个操作数是字符串,它会将另外一个操作数也转换为字符串
'+'运算符其中一个操作数是对象,则js使用特殊的方法将其转为原始值,可以通过valueOf得到一个原始值
console.log(({x:1,y:2})+111);//[object Object]111
‘==’运算符和‘!=’,如果对象和一个原始值比较,则转换将会遵照对象到原始值的转换
console.log(({x:1,y:2})==true)//false 对象的原始值时[object Object]
'!'运算符将其操作数转为布尔值,并取反
● Number类的定义toString()方法,可以将数字转换为字符串,有一个不定参数可选,如果不填,默认的为十进制的数
let n=17;
console.log(n.toString(2)) //10001
console.log(n.toString());//17
● toFixed() 根据小数点后的指定位数将数字转换为字符串
let n=123456.789;
console.log(n.toFixed(2));//123456.79
console.log(n.toFixed(5));//123456.78900
● parseInt()和parseFloat()
1.parseInt和parseFloat 全局函数,不从属于任何类的方法
parseInt解析整数,parseFloat 解析浮点数
parseInt 有两个参数,第一个参数时直接量,第二个参数可选,这个参数指定将数字转换为几进制,如果第一个参数直接量是非法的数字直接量,将会返回NaN
console.log(parseInt('3 blind mice'));//3
console.log(parentInt(' 3.14 meters'));//3.14
console.log(parseInt(-12.34));//-12
console.log(parentInt(.1));//NaN 整数不能以点开始
console.log(parseInt('$qer'));//NaN 整数不能以$开始
parseFloat 解析浮点数
此函数确定指定字符串中的第一个字符是否为数字。如果是,它会解析字符串直到到达数字的末尾,并将数字作为数字而不是字符串返回。
注 如果第一个字符不能转换为数字,parseFloat() 返回 NaN
console.log(parseFloat('$72.47'));//NaN
console.log(parseFloat('0.1'));//0,1
18 对象转换为原始值
1.对象到布尔值的转换非常简单 true
2.对象到字符串的转换是toString()
console.log(({x:1,y:2}).toString());//[object Object]
3.valueOf返回对象本身,除了Date意外
console.log( ({x:1,y:2}).valueOf());//{x: 1, y: 2} 返回对象本身
let d=new Date(2022,0,1);
console.log(d.valueOf());//1640966400000 返回的是1970年1月1日以来的毫秒数
4.对象到字符串的转换步骤
4.1 如果对象有toString()方法,则调用这个方法
4.2 如果对象没有toString()方法,会调用valueOf(),如果返回的时原始值,js将这个值转换为字符串,比如null,undefined
5.对象到数字的转换过程
5.1 如果对象有valueOf()的方法,如果返回一个原始值,则js将这个转换为数字,并返回这个数字
5.2 否则,对象有toString()方法,调用toString(),后者返回一个原始值,将原始值转换并返回
5.3 否则,js抛出一个类型错误异常
console.log(Number(({x:1,y:2}).valueOf().toString()) );//null
console.log(Number({x:1,y:2}) )//null
let arr=[];
console.log(Number(arr.valueOf().toString()))//0
console.log(Number(arr))
19变量声明
使用一个变量之前声明下。
1.1用关键字var 声明变量
var i;
var sum;
var i,sum;//可以同时声明多个变量
var message='hello';
var i=0,j=0,k=0;
1.2 如果声明的这个变量没有定义,怎这个变量的初始值undefined
1.3 变量可以是任意数据类型
1.4 什么是变量作用域?
变量作用域是程序源代码中定义变量的区域,全局变量拥有全局作用域,局部变量拥有局部作用域,局部作用域优先级高于全局作用域
var scope='global';//声明一个全局作用域
function checkscope(){
var scope='local';//声明一个局部作用域
return scope;
}
checkscope();//local
1.5 var 关键字,变量提升
function f(){
console.log(scope);
var scope='local';
console.log(scope);
}
等于
function f(){
var scope;
console.log(scope);
scope='local';
console.log(scope);
}
1.6函数作用域
是指函数内声明的变量在函数体内始终可见
1.7 全局变量,相当于window的一个属性
var scope='global';
console.log(window.scope);//global
1.8什么是作用域链?
作用域分为全局作用域和局部作用域,当声明了一个函数,函数内部就会形成一个局部作用域。 一个局部作用域都有上级作用域,上级作用域看的是函数声明。当函数调用时,会产生一个局部执行上下文(局部栈),多个局部栈上下文之间是没有关系的。在一个局部执行上下文中要完成形参的赋值、声明的提升、代码的执行。当执行代码时,如果访问一个变量x,先看这个变量是否是它自己上下文中的,如果是,变量x就是本上下文中的,如果不是则向上一级作用域中查找,不知查找一级,一直找到全局作用域,此时形成一个链,这个链叫作用域链
var x = 10;
function fn(){
console.log(x);
}
function show(f){
var x = 20;
fn();
}
show(fn);//10
function outer(){
var scope = "outer";
function inner(){
return scope;
}
return inner;
}
var fn = outer();
fn();//outer
网友评论