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

类型,值,变量

作者: 娇娇_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

    相关文章

      网友评论

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

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