美文网首页
类型,值,变量

类型,值,变量

作者: 娇娇_5038 | 来源:发表于2022-02-09 07:51 被阅读0次

计算机程序的运行是需要对值操作的,在编程语言中,能够表示操作的值的类型称做数据类型,编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将他赋值给一个变量。变量的值是一个符号名称,可以通过名称获取对值的引用

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

相关文章

  • golang的值类型,指针类型和引用类型&值传递&指针传递

    一,变量类型 变量分为值类型,指针类型和引用类型。以如下变量定义和赋值语句为例: output: 值类型变量a,值...

  • JS基础知识 (一)--变量类型和计算

    变量类型 js变量类型分为基本类型(或者叫值类型)和引用类型。(按照存储方式区分)• 值类型值类型:Number、...

  • JS之变量、作用域和内存

    变量及作用域 1、基本类型和引用类型的值ECMAScript 变量:基本类型值和引用类型值。将一个值赋给变量时,解...

  • 容器

    容器 数组 一维数组 声明格式:变量类型[] 变量名={值1,值2,值3,值4,值5,...}或者变量类型[] 变...

  • js的变量类型和计算

    变量类型 按照存贮方式来分,变量类型分为值类型和引用类型 1.JavaScript中的变量类型有哪些? (1)值类...

  • JavaScript 变量类型

    变量类型 JavaScript 中的变量类型分为值类型(又称为简单类型、基本数据类型)以及引用类型。 【值类型】:...

  • 变量类型和计算

    变量类型 值类型 引用类型(对象{}、数组[ ]、函数function) 值类型把每一个值都存到变量内存中,不会因...

  • JavaScript 知识点 - JS 基础

    变量类型:根据存储方式区分 值类型(变量存放值) 引用类型(变量存放地址): 对象,数组,函数 typeof运算符...

  • C#初级知识点(变量,运算符,值类型)

    1.变量1.1变量的定义:语法格式为类型+变量名=初始值1.2预定义数据类型(15种)值类型(13种)1.3值类型...

  • 2018年9月11日.NET笔试面试题

    值类型和引用类型的区别?将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引...

网友评论

      本文标题:类型,值,变量

      本文链接:https://www.haomeiwen.com/subject/ckfwkrtx.html