05_变量

变量

  变量 variables ,类似于代数。它们不是字母,而是蕴含值的符号。
  和直接量不同,直接量5就代表数字5。
  直接量“你好”,就是代表字符串“你好”。

  var的过程可以叫做声明 declaration ,也可叫定义 definition 。
//定义变量
var a;
//赋值
a=100;
//输出
console.log(a) //100
  使用var关键字来定义变量,关键字是有特殊功能的词语,关键字后面要有空格。
  var 是 variables 的缩写。
  当 var a; 时,电脑内存中会开启一个空间来保存变量a。
  可以给变量赋值,js中变量赋值用等号。等号右边的值赋给左边。
  当 a =100; 时,现在a变量的值就是100。

  变量需要先声明,才能使用。否则出现错误:Uncaught ReferenceError
  因为b没有被定义,所以b现在不是一个变量,系统不认识b,抛出引用错误。
console.log(b) //Uncaught ReferenceError: b is not defined

变量的名称

  变量的名称是标识符 identifiers ,任何标识符的命名都需要遵守一定的规则。
  在js中,标识符可以由字母a-z-A-Z,下划线_,美元符号$,数字0-9组成。但不能以数字开头,不能是js保留字。

  保留字是系统里面有特殊用途的字。

  合法的变量名:
var a;
var A;
var b333;
var _abc;
var $;
var $oO_Oo$;
var _______;
var _;
  不合法的变量名:
//不能以数字开头
//Uncaught SyntaxError: Unexpected number
//var 0a;
//不能有特殊符号
//Uncaught SyntaxError: Invalid or unexpected token
//var a@b;
//不能是关键字
//Uncaught SyntaxError: Unexpected token var
//var var
//不能是保留字
//Uncaught SyntaxError: Unexpected end of input
//var class
  可以使用中文,但没人用中文写js
var 小文;
小文=520;
console.log(小文) //520
  变量的赋值
var a; //定义
a=100; //赋值
console.log(a) //100
  定义和赋值一起写:
var a=100; //定义和赋值一起写
console.log(a) //100
  变量的赋值用等号,等号右边的值给左边,右边的值不变。
var a=100;
var b=200;
a=b; //改变左边a的值,右边的b值不变
console.log(a) //200
console.log(b) //200
  变量只需声明一次,后面要改变时不需要再声明即可改变。

  如果变量仅声明而没有赋值(没有赋值完成),此时变量的值是 undefined 。
var a;
console.log(a); //undefined

变量声明的提升

  js变量的另一种特别之处,是可以引用稍后声明的变量,而不会引发异常。
  这种概念称为 变量声明提升 hoisting 。
  js变量感觉上是被“”举起或提升到了所有函数和语句之前。
  然而提升后的变量将返回 undefined 。
  所以即使在使用或引用某个变量后存在声明和初始操作,仍会得到 undefined 值。

  其他语言没有这个特点,很多程序员都反感这个特点。
  下例先改变变量的值,再定义变量。由于js的变量声明提升机制,所以现在程序在执行前已经看到程序中定义变量的行,而把此行提升到所有函数和语句前。

  1 变量声明提升
a=100;
var a;
console.log(a) //100
  2 变量声明提升
a=100;
console.log(a) //100
var a;
  3 只能提升声明,而不能提升赋初值
console.log(a) //undefined
var a=100;
  等价于:
var a;
console.log(a);
a=100;
  不写var的情况
  定义a的时候没有写var,程序没有报错。说明a变量已被定义。
  其实不写var是定义了一个全局变量,作用域是不能控制的。
a=123;
console.log(a) //123
  用逗号隔开多个变量
  这个表示法,只能用于变量的连续定义。
var a=1,b=2,c=3;
console.log(a)
console.log(b)
console.log(c)
  区分变量与直接量
  变量的时候不能加引号,如果变量加引号会变成字符串。
  引号是字符串的定界符,所以在引号里面的a已经失去变量的意思,就是一个字符串。
var a=1;
console.log('a') //a

变量的类型,数据类型

  js中的值,无论是字面量还是变量,都有明确的类型。
  基本类型5种:
    Namber 数字
    String 字符串
    undefined 变量未定义时的值
    Boolean 布尔,有两个值 true 和 false
    null 空,后文细讲
  引用类型5种:
    后文细说

检测类型 typeof 关键字

  用 typeof 来检查变量的类型。
var a=100;
var b="你好";
console.log(typeof a) //number
console.log(typeof b) //string

number 类型

  js中所有数字都是 number 类型,不细分为整形 int 、浮点型 float 等。
  number类型:所有数字(不分大小、正负、整浮、进制)、Infinity、NaN。
var a1=111
var a2=111111111111111111111
var a3=-111111111111111111111
var a4=1.111
var a5=.5e6
var a6=0xff
var a7=017
var a8=Infinity
var a9=NaN
console.log( typeof(a1) ) //number
console.log( typeof(a2) ) //number
console.log( typeof(a3) ) //number
console.log( typeof(a4) ) //number
console.log( typeof(a5) ) //number
console.log( typeof(a6) ) //number
console.log( typeof(a7) ) //number
console.log( typeof(a8) ) //number
console.log( typeof(a9) ) //number

string 类型

var a="你好";
var b="123";
var c="";
console.log( typeof(a) ) //string
console.log( typeof(b) ) //string
console.log( typeof(c) ) //string
  变量的类型和定义没有关系,和赋值的内容有关系。
  定义的时候都是用var关键字。

动态数据类型

var a=123;
console.log( typeof(a) ); //number
a="你好";
console.log( typeof(a) ); //string

undefined 类型

  undefined 值的变量类型也是 undefined 。
var a;
console.log(a) //undefined
console.log( typeof(a) ) //undefined

+ 加号

  加号是一个运算符。
  加号两边都是数字时就是加法运算。
  如果有一边不是数字,是连字符。
console.log("你"+"好"); //你好
console.log(1+2); //3
console.log(1+"2"); //12
  练习
var a="1";
var b="2";
console.log("a+b"); //a+b
console.log(a+b); //12
  练习
var a=1;
var b="2";
console.log("a+b"); //a+b
console.log(a+b); //12
  练习
var a="1";
var b=2;
console.log("a"+b); //a2
  练习
var a=1;
var b=2;
var c=3;
console.log(a+b+"c") //3c 先算a+b
  练习
var a=1;
var b=2;
var c=3;
console.log("a"+a+b+"c") //a12c
  多个加号,先看左边。

变量类型的转换

string - number

  这个语句和 alert 差不多,也是弹窗。弹的是输入框。
prompt("请输入","默认输入")
  像这样的小功能,叫程序给我们提供的API,每个API都有不同的语法。
  像上面的语法就是: prompt("提示字符","默认值");
var a=prompt("请输入一些文字","输入在这里");
alert("你刚才输入的是:"+a)
  用户输入的所有值都是字符串:
var a=promopt("这是一个输入器,请输入一个加数")
var b=promopt("再输入一个加数")
var sum=a+b;
alert(sum) //当用户输入3和4时,弹出结果却是34,而不是3+4=7
  所以这时候需要一些方法把内存中表示数字的字符串转为对应的数字。
  parseInt()和parseFloat()

parseInt

  parseInt 是把一个 string 转为一个整数,不四舍五入。直接取整数部分。
var a="123";
var b=parseInt(a);
console.log(b)
console.log(typeof b) //number
 
//只取整数部分,以下的输出都是123
console.log(parseInt("123")) //123
console.log(parseInt("123.4")) //123
console.log(parseInt("123是一二三")) //123
console.log(parseInt("123是123")) //123
console.log(parseInt("-123是-123")) //-123
//注: 上面的的括号嵌套在一起,程序从内层向外执行
  修改上面的计算器,把用户输入的字符串转为数字计算
var a=parseInt(prompt("输入一个加数"))
var b=parseInt(prompt("再输入一个加数"))
alert("和是"+(a+b))
  不能这样写
var a=prompt("输入一个加数")
var b=prompt("再输入一个加数")
alert("和是"+parseInt(a+b)) //像这样写不能转换成功,因为字符串先已经先拼接
  parseInt() 不但能转换整数,还能转进制数。
  可以把任何进制转为十进制。
  下面的输出结果都是15
console.log(parseInt(15))
console.log(parseInt(17,8))
console.log(parseInt(1111,2))
console.log(parseInt("15e6",10))
console.log(parseInt("15*6",10))
console.log(parseInt("0xf",16))
console.log(parseInt("f",16))
//"f" 为什么是加引号的"f"
//f 会被认为是 变量
//0xf 0xf本来就是15,再用16进制转一下会变成21
//如果不加引号,会被先换算
  注意,数字保存在内存中时还是原来的进制,只是显示出来时是10进制。
var a=0xff;
var b=a;
console.log(b) //255
 
var a1=0xff;
var b1=parseInt(a1,16); //把16进制的 0xff 数转成 10 进制的 579 了。
console.log(b1) //597
 
var a2="0xff"; //把 "0xff" 强制转成 10 进制
var b2=parseInt(a2,16); //10进制的255
console.log(b2) //255
  前面是0的情况
var a="1xz";
var b="0xz";
console.log(parseInt(a))//1
console.log(parseInt(b))//NaN,为什么不是0
  parseInt转换时,如果前面不是0,会进行常规处理。
  如果是0时,他还要看下一们是不是x,也就是看这个数是不是表示16进制的0x
  但是0xZ的0x表示16进制,但Z不是16进制里面的数,所以转换失败,NaN。

parseFloat

  把字符串转为浮点数。
console.log(parseFloat("123.4.5")) //123.4
  js中的数字不区分整数浮点数,但转换的时候需要区分。

number - string

  把一个数字与字符串连接,他们将自动转为字符串。
console.log(typeof (123+"")) //string
 
原文地址:https://www.cnblogs.com/daysme/p/6215434.html