第三章 基本概念(一)

第三章 基本概念

本章基本内容

  1. 语法
  2. 数据类型
  3. 流控制语句
  4. 理解函数

(一)语法

  • 区分大小写
    在JS里面变量,函数名和操作符都严格区分大小写。这就意味着变量名test和Test分别表示两个不同的变量。而函数名不能用typeof,因为它是一个关键字。

  • 标识符
    所谓标识符就是指变量,函数,属性的名字,或者函数的参数。
    标识符的命名规则:
    只能是字母或数字或下划线或美元($)
    开头不能是数字,因为他分不清是数字还是变量
    按照惯例命名采用的是驼峰大小格式,也就是第一个字母小写,剩下的每个有意义的单词的首字母大写
    千万不能把关键字,保留字,true,false和null作为标识符.

  • 注释
    // 单行注释
    /* 块级注释

    */

  • 严格模式

    "use strict" 表示执行的是严格模式
    例如
    function dosomething(){
    "use strict"
    //函数体
    }
    严格模式JS的执行结果会有很大的不同,支持严格模式的浏览器包括 IE10+,FireFox4+ ,Safari5.1+ ,Opera 12+ 和Chrome

  • 语句
    在JS里面语句一般都是分号结尾,要是省略分号,则有解析气确定语句的结尾。(这种不推荐)

  • 关键字和保留字
    1.在JS里面保留了一些关键字不能作为标识符。期待后用,比如 break do else catch delete等等这些没必要记忆。写的时候不用命名就可以

(二)变量

  1. 变量的定义要使用var操作符。(var 是一个关键字)后面跟变量名(标识符)即可:

例如 var message ;

  1. 用window来定义

例如
window["a"] = 3;
window.alert(a);
例如
function test(){
var message ;
}
这行代码定义了一个名为message的变量。该变量可以用来保存任何值(像这样未经过初始化的变量都会保存一个特殊的值--undefined)

因此定义变量的同时就可以设置变量的值。

例如:
var message = "hi";

所以变量message就保存了一个字符串"hi"像这样的初始化变量并不会把他标记为字符串类型,初始化的过程就是给变量赋一个值那么简单。

因此,可以在修改变量值得同事修改值得类型。如下
var message = "h1";
message = 100 ; 有效但是不推荐

在上面这个例子中变量MESSAGE一开始保存了一个字符串值"hi",然后该值又被一个数字值100缩代替。虽然我们不建议修改变量的类型。但是这样完全有效

特别注意的是即使使用var操作符定义的变量将成为定义该变量的作用域的局部变量。也就是说如果在函数中使用var定义一个变量,那个这个变量在函数退出后就会被销毁

例如
function test(){
var message = "hi"; //局部变量
}
test();
window.alert(message); //错误

这里变量message实在函数中用var来定义的。当函数被调用就会创建该变量并为其赋值。而在此之后,变量又会被销毁。所以例子中的下一行代码就会导致错误
也可以这样做

function test(){
message = "hi"; //全局变量
}
test();
alert(message); //"hi"

这个例子省略了var操作符,因此message就成了全局变量。这样只要调用一次test()函数,这个变量就变成全局变量,任何地方都能访问

(三)数据类型

typeof 操作符

  1. undefined--> 如果这个值未定义
  2. boolean -->如果这个值是布尔值
  3. string ----> 如果这个值是字符串
  4. number--> 如果这个值是数值
  5. object----> 如果这个值是对象或者null
  6. function--> 如果这个值是函数

var message = "some string";
alert(typeof(message)); //"string"
alert(typeof(message)); //"string"
alert(typeof 95); //"num"
这几个例子说明typeof操作符的操作数可以是变量message,也可以是数值字面量
typeof 是一个操作符而不是函数。尽管括号里面都能使用,但是不是必需的。

  • Undefined 类型
    他表示的意思就是声明变量但是没有对他加以初始化,这个变量值就是undefined
    例如 var message ;
    window.alert(message == undefined) //true

但是包含undifined值得变量和尚未定义的变量还是不一样的。看下面:
var message ; //这个变量声明后默认取得了undefined值
window.alert(message); //undefined
window.alert(age); //产生错误
但是你要使用
window.alert(typeof(message)); //undefined ;
window.alert(typeof(age)); //undefined;
结果则是一样的。

  • Null类型
    Null类型是第二个只有一个值得数据类型。这个特殊值就是null,null值表示一个空对象指针。而这正是使用typeof操作符检测NULL值返回object的原因
    var car = null ;
    window.alert(typeof car); // "object"
如果定义的变量准备保存对象,那最好变量初始化的时候为null,而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否保存一个对象的引用.

if(car !=null)
{

     //对car对象执行了某些操作

}
实际上 undefined值派生自null值得.
特别注意alert(null = = undefined); //true
这里,位于null和undefined之间的相等操作符

尽管null和undefined 有这样的关系,但是他们的用途完全不同。所以无论在什么情况下,都没有必要把一个变量的值显示的设置为undefined

可是同样的规则对null却不管用。
换句话说:只要保存的变量是对象类型,建议初始用null

  • Boolean类型(布尔类型)
    该字面量只有2个字面量值: true和false
    这两个值与数字不是同一回事,因此true不一定等于1,而false不一定等于0
    var found = true ;
    var lost = false;
    Boolean的字面值 true和false也是区分大小写的。也就是说True和False(以及其他的混合大小写形式)都不是Boolean值 ,只是标识符
    虽然Boolean的字面值只有2个,但是所有类型的值都有与这2个布尔值等价的值。要将一个值转换成其他对应的布尔值,可以调用函数Boolean()

var message = "Hello world";
var meaasge = Boolean(message);
在这个例子里面字符串message转换成了一个Boolean值.该值被保存在messageAsBoolean变量中.可以对任何数据类型的值调用Boolean()函数。并且总会返回一个布尔值.

  • Number
    这种类型用来表示的整数和浮点数(浮点数也被称之为双精度数值)
    最基本的数值是十进制,十进制整数可以直接输入:
    var intNum = 55; //整数
    除了十进制以外还可以通过八进制(以8位基数)或者十六进制(以16为基数)的字面值来表示.其中八进制第一位必须是0,然后八进制数字序列(0~7)如果字面值中的数值超出了范围,那么前面0将被忽略,后面的数组将被当做十进制数值解析
    var oct1 = 070 //八进制的56
    var oct2 = 079 //无效的八进制数值解析为79
    var oct3 = 08 ; //无效的八进制数值 解析为8
    (八进制字面量在严格模式下是无效的,所以会导致JS引擎抛出错误)
    十六进制字面值的前两位必须是0x,后面跟任何十六进制数字(09及AF)其中字母A~F可以大写,也可以小写。如下面的例子:
    var hexnum1 = 0xA ; //十六进制的10
    var hexNum2 = 0x1f ; //十六进制的31
    在进行算术计算时,所有以八进制和十六进制表示的数值最终都会被转成十进制
  • 浮点数值
    所谓浮点数值,就是该数值中必须包含的一个小数点,必须小数点后面有一位数字。虽然小数点前面可以没有整数,但是强力不推荐。

var floatNum = 1.1 ;
var floatNum = 0.1;
var floatNum =.1; //有效但不推荐

由于保存浮点数值需要的内存空间是保存整数值得倍.因此当小数点后面没有跟任何数字的时候,这个数值可以作为整数值来保存。同样的当浮点数值本身就是一个整数(如1.0)那么该值也会被转换成整数

var floatNum = 1.; //小数点后没有数字解析为1
var floatNuM = 10.0 ; //整数--解析为10

对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示.用e表示法表示的数值等于e前面的数值乘以10的指数次幂。ECMA中 e表示法的格式也是如此

var floatNum = 3.125e7; //等于3.12510的7次方
var floatNum2 = 3e-17 //等于3
10的负17次幂

这里特别注意的就是浮点数精度最高是17位小数,但是计算的时候远远不如整数,例如0.1加0.2的结果不是0.3而是0.30000000000000004这个小小的舍入误差会导致无法测试特定的浮点数值,19.31*100=1930.9999999999998,所以浮点数计算必须要确定位数。

if(a+b==0.3){
window.alert("结果是0.3");
}
他这辈子也弹不出来

  • 数值范围
    在JS中保存的最小数值保存在Number.MIN_VALUE中--在大多数的浏览器中这个值是5e-324意思就是5*10的-324次幂能够表示的最大数值保存在Number.MAX_VALUE中 这个值也就是1.797693e+308次幂
    如果计算的结果超过了这个区间的值。那个这个数值会自动转换成Indinity值.如果是负数就是-Infinity(负无穷)如果这个数是正数,则会转换成Infinity(正无穷)
如果某次计算返回了正或者负的Infinity值。那么该值将无法继续参与下一次的计算.因为Infinity是不能够参与计算的数值.要是想判断一个数值是不是有穷的可以用isFinite()函数
如果有穷就返回的是true 要是无穷就是false

NaN

NaN即非数值(Not a Number)
在JS里面任何数值除以0都会返回NaN,因此不会影响代码的执行
NaN本身有2个非同寻常的特点

  1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN

  2. NaN与任何值都不相等,包括NaN本身

下面的代码就会返回false
alert(NaN == NaN) //false

针对这个特点JS里面有定义了isNaN()函数,这个函数接受一个参数,用来判断该参数是否不是数值.
要是数值则直接返回true 要不是数值则返回false
他执行前会优先执行Number()这个方法这样比如说"10"他会变成10这样来判断

alert(isNaN(NaN))   //true
alert(isNaN(10))    //false (10是一个整数)
alert(isNaN("10"))  //false (可以被转换成数值10)
alert(isNaN("blue"))//true (不能被转换成数值)
alert(isNaN(true));  //false(可以被转换成数值1)

数值转换

有3个函数可以把非数值转换成数值:Number(),parseInt(),parseFloat()
第一个函数,即Number()可以用于任何数据,而另外2个则专门用于把字符串变成数值.这3个函数对于同样的输入会返回不同的结果
Number()转换规则如下:

  1. 如果是布尔类型,true和false将分别转换为 1 和 0
  2. 如果是数字值 ,只是简单地传入和返回
  3. 如果是null值 ,返回0
  4. 如果是undefined ,返回NaN
  5. 如果是字符串遵循下面规律:
  • 如果字符串中只包含数字(包括前面带正号或者负号的情况,则转换成十进制数值)即"1"会变成1,"123"会变成123,而"011"会变成11(前面的0被忽略了)
  • 如果字符串包含有效的浮点格式例如"1.1"则将其转换为对应的浮点数值(同时也会忽略前面的0)
  • 如果字符串是空的(不包含任何字符),则会将其转换为0
  • 如果字符串中包含上述格式以外的字符,则将其转换为NaN
  • 具体见下面:

var num1 = Number("Hellow") // NaN
var num2 = Number("") // 0
var num3 = Number("00000011") //11
var num4 = Number(true) //1

由于Number()再转换成字符串的时候不够方便和快捷。所以衍生出parseInt()和parseFloat()

parseInt()在转换的时候她会忽略字符串前面的空格,直到第一个非空格字符串。如果第一个字符不是数字字符或者负号parseInt()就会返回NaN
也就是说parseInt()转换空字符串会返回NaN

如果第一个字符串是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如:"1234abcdef"会转换成1234,因为"abcdef"会被完全忽略。类似的"22.5"会被转化成22.因为小数点并不是有效的数字字符.他只能解析数字,null,""什么的都是NaN

如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即前面的十进制,八进制,十六进制,也就是说如果字符串以0x开头且后面跟数字字符,就会当成一个十六进制整数,如果字符串以0开头且后面跟数字字符,则会当成一个八进制数来解析)

具体见下面:
var num1 = parseInt("1234abcd"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(十六进制)
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56(八进制)
var num6 = parseInt("70"); //70(十进制)
var num7 = parseInt("0xf"); //15(十六进制)

这里特别注意的就是JS里面尽量少用8进制数,尽量少用8进制数,尽量少用8进制数,重要的话说3遍
为了消除困惑,他允许你能传递第二个参数.
var num = parseInt("0xAF",16); //175
实际上如果制定了16作为第二个参数,字符串可以不带前面的"0x"
var num1 = parseInt("AF",16); // 175
var num2 = parseInt("AF"); //NaN
var num3 = parseInt("10",10); //10
var num4 = parseInt("10",16); //16

String类型

String类型用于表示由0或多个16位Unicode字符字符组成的字符序列,及字符串。字符串可以由双引号("")或者单引号('')表示,因此下面两种字符串的写法都是有效的
var fristName = "Nike";
var lastName = 'killer';

与PHP不同的是在JS里面双引号和单引号没有什么区别。用双信号表示的字符串和用单引号表示的字符串完全相同。不过用双引号开头的字符串也必须以双引号结尾,而已单引号开头的字符串必须以单引号结尾。
  • 字符字面量
    String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者其他用途的字符。

例如
\n 表示换行
\r 表示回车
等等这些

这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析,比如
var text = "This is:\u03a3.";
上面这个text中里面的字符数一共有9个,6个字符长的转义序列表示1个字符
任何字符串的长度都可以通过length属性来取得。例如:
alert(text.length); //输出结果就是9

在JS里面字符串是不可改变的。也就是说字符串一旦创建。他们的的值就不能改变了。要改变某个变量保存的字符串,首先要销毁原来的字符串。然后再用一个包含新值得字符串进行填充.

例如
var lang = "JavaScript";
lang +="Perfect";
lang 就变成JavascriptPerfect

例如:
var gae = 11;
var ageString = age.toString();//字符串"11"
var found = true;
var foundString = found.toString(); // 字符串"true";

特别注意的是数值,布尔值,对象,字符串值都有这个方法.但是null和undefined没有这个方法.

多数情况下调用toString()不必传递参数。但是调用toString()也可以传递参数

例如 var num = 10 ;
window.alert(num.toString(10)); //"10"
window.alert(num.toString(2)); // "1010"
window.alert(num.toString(8)); //"12"
window.alert(num.toString(16)); //"a";
特别注意的就是默认的没有参数的输出值与指定基数10时相同

在不知道转换的值是不是null或者undefined情况下,还可以用String()方法这个函数能够将任何类型的值转换为字符串。String()函数怎徐下列转换规则:
1.如果值有toString()方法就调用该方法,返回相应的结果
2.如果值是null,则返回"null"
3.如果值是undefined,则返回"undefined"

例如:
var value = 10;
var value2 = true;
var value3 = null;
var value4;
window.alert(String(value)); // "10"
window.alert(String(value2)); //"true"
window.alert(String(value3)); //"null"
window.alert(String(value4)); //"undefined"

Object类型

后续会讲到

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,658评论 0 6
  • ch3 基本概念 标签(空格分隔): JavaScript 语法 标识符 第一个字符必须是字母、下划线或美元 驼峰...
    大脸菌阅读 546评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,604评论 18 399
  • 一)无论如何,我已经开始后悔了,后悔当初义无反顾地远嫁了,虽然爸妈从未反对,孩子爸仍一如既往地包容。但是等到自己经...
    九妃阅读 199评论 8 3
  • 八斗才阅读 3,651评论 0 0