1-JS基本语法

JS基本语法字符串取空格

String.prototype.trim = function () {
  return this.replace(/^\s+|\s+$/g,"");
};

一、定义

javascript是一种弱类型、动态类型、解释型的脚本语言。

  • 弱 类 型:类型检查不严格,偏向于容忍隐式类型转换。
  • 强 类 型:类型检查严格,偏向于不容忍隐式类型转换。
  • 动态类型:运行的时候执行类型检查。
  • 静态类型:编译的时候就知道每个变量的类型。
  • 解 释 型:程序不需要编译,程序在运行的时候才翻译成机器语言,每执行一次都要翻译一次,因此效率比较低,但是跨平台性好。
  • 编 译 型:程序在执行之前需要一个专门的翻译过程,把程序编译为机器语言的文件,运行时直接使用编译的结果就行了。
  • 标记语言:标记语言的存在就是用来被读取(浏览)的,而其本身是没有行为能力的,在标记语言里你会看到<和>这些尖括号,这是用来写出“层次”和”属性”的,换句话说,它是被动的。并不具备与访问者互动的能力。
  • 编程语言:它是具有逻辑性和行为能力,这是主动的。说通俗一点,它是有思想的。
  • 脚本语言:它介于标记语言和编程语言之间,脚本语言不需要编译,可以直接用,由解释器来负责解释。

二、JS历史

1:Netsape发明了javascript。

1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。比如,网页上有一栏用户名需要填写,浏览器无法判断用户是否真的填写了,只有让服务器去判断。如果没有填写就返回错误,要求用户重新填写。太浪费时间和服务器资源了。更何况在那个用调制解调器上网的年代。

2:JS之父Brendan Eich(布兰登 · 艾奇)

网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。当时工程师Brendan Eich就是负责开发这种新语言。

3:为什么叫JavaScript

1995年Sun公司将Oak语言改名为Java,正式向市场推出。Sun公司大肆宣传,允诺这种语言可以”一次编译,到处运行”。很有可能成为未来市场的主宰。
网景公司动了心,决定与Sun公司结成联盟。它不仅允许JAVA程序以applet(小程序)的形式,直接在浏览器中运行。甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样使HTML网页过于复杂,后来才不得不放弃。
总之,因为Sun公司完全介入网页脚本语言的决策。Js后来就是网景公司和Sun两家公司一起携手推向市场的,这种语言被命名为java+script不是偶然的。

4:JS和JAVA语言没有任何关系

JS之父并不喜欢JAVA,为了应付公司安排的任务,他只用了十天就把JS设计出来了。因为设计时间太短,语言的一些细节考虑的并不太严谨。
设计思路:
1:借鉴C语言的基本语法。
2:借鉴JAVA语言的数据类型和内存管理。
3:借鉴Scheme语言,将函数提升到”第一等公民的地位”。
4:借鉴Self语言,使用基于原型(prototype)的继承机制。
所以,JS实际是两种语言风格的混合产物:(简化的)函数式编程+(简化的)面向对象编程。

5:JS标准化---ECMAScript

因为javascript1.0的成功,netscape在navigator 3.0中发布1.1版。此时微软决定进军浏览器,在IE3.0种搭载了javascript的克隆版,叫JScript。在微软进来以后,有三种不同的javascript版本存在,即navigator3.0的javascript、IE的JScript、以及Cenvi中的ScriptEase。
由于javascript没有一个标准来统一其语法和特性,3种不同版本的恰恰突出了这个问题,这个语言的标准化显然势在必行。
1997年,javascript1.1作为一个草案提交给欧洲计算机制造协会(ECMA)。最后定义为ECMAScript的全新脚本语言。从此,浏览器开始努力将ECMAScript作为Javascript的基础。

三、JS组成

js组成: ECMAScript + BOM + DOM
尽管ECMAScript是一个重要标准,但它并不是JS的唯一部分。一个完整的JS实现是由3个部分组成的。
ECMAScript(核心) + 浏览器对象模型(BOM)+ 文档对象模型(DOM)
ECMAScript描述了该语言的语法和基本对象。
BOM描述了与浏览器进行交互的方法和接口。
DOM描述了处理网页内容的方法和接口。

四、script标签

<script>标签用于定义客户端脚本。它既可以包含脚本语句,也可以通过src属性指定外部脚本文件。
属性:
  • language:用来指定<script>标签中的脚本类型,即javascript。已废弃,大多数浏览器已经忽略它了,所以不要在使用。
  • type:它也是用来指定<script>标签中的脚本类型,即text/javascript。它也是type的默认值,所以可以忽略指定。
  • src:指定外部的脚本文件。如果指定该属性,script标签包含的JS脚本不会执行
不可以使用单标签,即<script type=“text/javascript”/>。
script标签可以放在页面中的任何位置,但是我们一般放在head和body中。

五、js初体验

  • document.write:输出内容到页面,可同时输出多段文本。
    document.write('我叫', 'thomas!');
  • document.writeln:输出内容到页面,但是会在表达式后面写一个换行符。
    eg:document.writeln(‘我叫’, ‘thomas’);
    document.writeln('我叫', 'thomas');
writeln() = write() + write('\n');

为什么换行没起作用?

在HTML的解析中,只会把<br/>解析成换行,\n会被解析成空白符,空白符就被解析成一个空格。但是在pre、textarea标签内,HTML不会解析空白符。

如何让输出内容换行?

1:输出带有<pre>标签的内容。
document.write('<pre>hello') // 换行 (字会变小,不推荐使用)
2:输出带有<br/>标签的内容。
document.write('晴天<br/>');
注:window.onload当窗口执行完毕以后执行的事件(动作)
如果页面加载完毕后再执行document.write,这个HTML页面将被覆盖。

六、如何输出标签符号

为了正确的显示预留字符,我们必须在HTML源代码中使用字符实体。如果直接使用<或者>,浏览器会误认为标签。
HTML实体格式:&entity_name; 或者 &#entity_number;
实体名称对大小写敏感
使用实体名称易于记忆,但是浏览器也许并不支持所有的实体名称(对实体数字的支持就很好)。

七、实体符号列表

八、js语句

JS语句就是向浏览器发出的命令。该语句告诉浏览器应该做什么。
分号(英文)用于分割JS语句,所以每条语句都应以分号结束。使用分号我们可以在一行内编写多条语句。但是在JS中分号来结束语句是可选的。
JS代码是JS语句的序列。浏览器会按照编写的顺序来执行每条语句。
JS代码块:JS语句通过代码块的形式进行组合。块由左花括号开始,右花括号结束。它的作用就是使语句一起执行。
JS语句严格区分大小写。

九、js注释

注释可用于提高代码的可读性。Javascript不会执行注释,用户也不会看到注释,注释只是方便开发者更好的理解JS代码。
单行注释: 以//开头。
多行注释: 以/*开头,以*/结尾。
文档注释: 以/**开头,以*/结尾。

十、js变量

变量是存储信息的容器,用var关键词来声明(创建)变量。
var a = 56;
变量命名规则:以字母、数字、下划线和$组成,但是不能以数字开头。
JS语句和JS变量都是严格区分大小写。 不能用拼音来命名。
var 6a = '' // 错
var _ab = '' // 对
var $m7 = '' // 对
我们可以在一条语句中声明多个变量,该语句以var开头,并使用英文逗号分隔。
var a, b, c;
我们可以通过=给变量赋值,然后通过alert查看变量内容。
var a = 1;
alert(a);

十一、变量常用命名法

  • 驼峰命名法(Camel):第一个单词的首字母小写,后面的单词首字母大写。
  • 帕斯卡命名法(Pascal):所有单词的首字母大写。
  • 匈牙利命名法(Hungarian):在变量名最前面添加相应小写字母来标识变量的类型,后面的单词首字母大写。

十二、保留关键字

十三、数据类型

  • 基本数据类型:字符串类型(string)、数值类型(number)、布尔类型(boolean)、undefined、null
  • 引用数据类型:对象(object),函数(function),数组(array)。
  • 字符串类型:必须要由成对的单引号或双引号包起来。内容可以是任意文本,只要不包含包围字符串的引号就可以。如果一定要包含,则用反斜杠转义。
    eg:  123  男“  ‘玩游戏’
  • 数值类型:可以带小数点,也可以不带小数点。
    eg: 34  12.1
  • 布尔类型:只有两个值:true,false。
  • undefined:表示声明的变量没有值。
    var a;
    alert(a); // undefined
  • null:用来表示尚未存在的对象。
    对象、函数后面再详细讲解。
    我们可以通过typeof来查看变量的类型。
    var a = 56;
    console.log(typeof(a));  // number
    var s = 'abc';
    console.log(typeof s);    // string
    
    // typeof(a) == type a

十四、运算符

<1>算术运算符:+、-、*、/、%(取余)、++(递增)、--(递减)

alert( 10 / 4 );   //2.5
alert( 10 % 4 );   //2
// 取余的结果正负取决于 % 前面的值(面试会问)
var  i = 3;
i++;
alert( 'i =' + i );  // i=4
var m = 3,n;
n = m++;
alert('m='+m+',n='+n);    // m= 4,n=3
var m = 3, n;
n = ++m;
alert('m='+m+',n='+n);    // m= 4,n=4
var x = 4,y = 5;
var z = x++ + y++;
alert('x='+ x );    // 5
alert('y='+ y );   // 6
alert('z='+ z );   // 9
var a = 3;                                                      
var b = a++ + ++a + a++;
alert('a='+a +',b='+b );  // a=6,b=13
// ++在后面,先取变量的值,把取到的值赋给左边的变量,然后变量自己再增1
// ++在前面,变量先加1,然后再赋值

<2>赋值运算符:=、+=、-=、*=、/=、%=

var  a += 5;    // a = a+5
var  a *= 5;   // a = a * 5

<3> +运算符:可用于把字符串变量连接起来。(求和,拼接)

如果 + 号两侧都是整数,则求和,如果有一个是字符串,则拼接
字符串类型和任何类型的数据相连接,都是字符串
var a = 6;
var s= 'hello';
var b = true;
alert( a + s + b );  // 6 hello true
alert( s + a + a);   // hello66
alert( a + a + s );  // 12hello
当用/运算符的时候,Math.round的用法(四舍五入)。
var a = 1.5;
alert(Math.round(a);   // 2
parseInt: 将字符串转换成整数。
var a = 1.5;
alert(parseInt(a));     // 1
parseFloat: 将字符串转换成浮点数。
var a = 1.5;
alert(parseFloat (a));  // 1.5

var c = '1.5px';
alert(parseFloat(c));  // 1.5
var c = '1.5px21';
alert(parseFloat(c))   // 1.5

<4>关系(比较)运算符:>、<、>=、<=、==、===、!=、!== (关系表达式最终的结果是成立或不成立,所以值为true或false)

var a = 5, b = 6;
alert(a>b);   // false
alert(!6 > 7);  // false
===与==的区别:
对于string和number等基本类型,不同类型之间比较,==比较会将变量隐式转换成同一类型的值进行比较。而===如果类型不同,其结果就是不等。
如果是array和object等引用类型,==和===没有区别,如果两个的变量是同一个对象就为true,否则为false。
基本类型和引用类型进行比较,==会将引用类型转换成基本类型,再进行值比较。而===因为类型不同,结果为false。
var x = 100,y = '100';
alert(x==y); //true(只比较数值,不比较类型)
alert(x===y); //false(比较数值和类型)
alert( x != y ); //false(只比较数值,不比较类型)
alert( x !== y ); //true(比较数值和类型)

<5>逻辑运算符:&&、||、!

var h5 = 56, js = 67;
var r = h5 >= 60 && js <= 60;
alert( r ); // false

var r2 = h5 >= 60 || js >=60;
alert( r2 ); // true

var r3 = !(h5 > 60);
alert(r3); // true

var a = 5, b = 6;
alert( a < 1 && ++b > 5 ); // false
alert(b); // 5  (&&是短路运算符,全真才为真左边的a < 1 已经是false,所以他不去计算右边了,所以b = 6)

var a = 1 && 2+2;
alert(a); // 4 (因为左边为真,所以会继续去看右边)

var a = 0 && 2 + 2;
alert(a); // 0 (因为0转布尔值为false,左边为假,所以不会去看右边)

var a = 5,b = 6;
alert( a || ++b); // true
alert( b ); // 6 (左边的为true,不再去计算右边)

alert(3 && 6);  //6
alert(0 && 6);  //0
// 如果左右两边都为数值,0相当于false,非0相当于true

alert('hello' && 'world');  //world
alert('' && 'word');   //””
// 空字符串相等于false,非空字符串相当于true
三目运算符: ? :  (问号前面的为true执行:前面的,否则执行:后面的)
// 判断一个年份是否是闰年(能被4整除但不能被100整除,或者能被400整除)
var year = 2018;
var r = year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? "闰年" : "平年";
alert(r);

十五、运算符的优先级

. [] (): 字段访问、数组下标、函数调用以及表达式分组
++、--、!、delete、new、typeof
*、/、%
+、-、+ 加、减、字符串连接
关系运算符、instanceof(判断某个对象是否是某个类的一个实例)
逻辑运算符
赋值运算符
()作用:可以表达式分组、改变运算符的优先级、函数调用。
new运算符:用来创建对象。

应用:

1:为抵抗洪水,战士连续作战89小时,编程计算共多少天零多少小时?

day = 89 / 24;
var house = day - parseInt(day);
alert(parseInt(day) + '天' + house +"小时");
2:小明要到美国旅游,可是那里的温度是以华氏度为单位记录的。他需要一个程序将华氏温度(80度)转换为摄氏度,并以华氏度和摄氏度为单位分别显示该温度。
提示:摄氏度与华氏度的转换公式为:摄氏度 = 5/9.0*(华氏度-32)保留3位小数。
var wet = 80;
var loa = 5 / 9.0 * (wet - 32);
alert(wet + "华氏度" + '、' + loa + '摄氏度');

十六、强制转换

强制转换主要指使用Number、String和Boolean三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。

1:Number强制转换

(1)参数为原始类型值的转换规则:
原始类型的值主要是字符串、布尔值、undefined和null,它们都能被Number转成数值或NaN。
NaN:not a number,当数学计算得不到数字结果时,该值就是NaN。
isNaN:判断变量是否为NaN。
// 数值:转换后还是原来的值
var num = Number(324);
alert(typeof num + num);  // number 324
// 数值:转换后还是原来的值
var num = Number(324);
alert(typeof num + num);  //number 324
// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324
var num =Number('324');
alert(typeof num + num);  //number 324
// 字符串:如果不可以被解析为数值,返回NaN
var num =Number('324abc');
alert(typeof num + num);  //number NaN
// 空字符串转为0
var num =Number('');
alert(typeof num + num);  //number 0
// 布尔值:true 转成1,false 转成0
var num = Number(true);
alert(typeof num + num);  //number 1
var num = Number(false);
alert(typeof num + num);  //number 0
// undefined:转成 NaN
Number(undefined) // NaN
var num =Number(undefined );
alert(typeof num + num);  //number NaN
// null:转成0
 var num =Number(null);
alert(typeof num + num);  //number 0
Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
(2)参数为对象的转换规则:
简单的规则是,Number方法的参数是对象时,将返回NaN。
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN

var obj = Number ({});
alert(typeof obj + obj); // number NaN
var num = Number([]);
alert(typeof num + num); //number 0
实际上,Number背后的真正规则复杂得多,内部处理步骤如下:
  • 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
  • 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
  • 如果toString方法返回的是对象,就报错。

2:String强制转换

(1)参数为原始类型值的转换规则:
数值: 转为相应的字符串。
var str = String(123.234);
alert(typeof(str)+ str); // string 123.234
字符串: 转换后还是原来的值。
var str = String('he');
alert(typeof(str)+ str); // string he
布尔值: true转为"true",false转为"false"。
var str = String(true);
alert(typeof(str)+ str); // string true
var str = String(false);
alert(typeof(str)+ str); // string false
undefined: 转为"undefined"。
var str = String(undefined);
alert(typeof(str)+ str); // string undefined
null: 转为"null"。
var str = String(unll);
alert(typeof(str)+ str); // string null

(2)参数为对象的转换规则:

String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。
var str = String({});
alert(typeof(str)+ str); // string [object Object]
var str = String([1,3]);
alert(typeof (str)+ str); // string 1,3
String内部处理步骤如下:
  • 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  • 如果toString方法返回的是对象,再调用valueOf方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  • 如果valueOf方法返回的是对象,就报错。

3:Boolean强制转换

(1)参数为原始类型值的转换规则:
转换规则相对简单:除了以下六个值的转换结果为false,其他的值全部为true。undefined、null、-0、0或+0、NaN、''(空字符串)
var num = Boolean('');
alert(typeof(num) + unm); // boolean false
(2)参数为对象的转换规则:
所有对象(包括空对象)的转换结果都是true。
var num = Boolean([]);
alert(typeof(num) + unm); // boolean true

十七、自动转换

自动转换的规则: 预期什么类型的值,就调用该类型的转换函数。比如,某个位置预期为字符串,就调用String函数进行转换。如果该位置即可以是字符串,也可能是数值,那么默认转为数值。
由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串i的地方,全部使用Boolean、Number和String函数进行显式转换。

1:自动转换为布尔值

当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。
if ( !undefined && !null && !0 && !NaN && !'' ) { console.log('true'); } // true
// 写法一 expression ? true : false
// 写法二 !! expression

2:自动转换为字符串

当JavaScript遇到预期为字符串的地方,就会将非字符串的数据自动转为字符串。系统内部会自动调用String函数。字符串的自动转换,主要发生在加法运算时。当 一个值为字符串,另一个值为非字符串,则后者转为字符串。
console.log('5' + 1) // '51'
console.log('5' + true) // '5true'
console.log('5' + false)  // '5false'
console.log('5' + {}) // '5[object Object]'
console.log('5' + []) // '5'
console.log('5' + function (){}) // '5function (){}'
console.log('5' + undefined) // '5undefined'
console.log('5' + null) // '5null'

3:自动转换为数值

当JavaScript遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用Number函数。
 
console.log('5' - '2') // 3
console.log('5' * '2') // 10
console.log(true - 1) // 0
console.log(false - 1) // -1
console.log('1' - 1) // 0
console.log('5' * []) // 0
console.log(false / '5') // 0 
console.log('abc' - 1) // NaN
除加法运算符有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。
console.log(+'abc') // NaN
console.log( -'abc') // NaN
console.log(+true) // 1 
console.log( -false) // 0
特殊:
console.log(null == undefined) // true
console.log(null == false ) // false
console.log(undefined == false) // false

十八、八进制和十六进制介绍

八 进 制:一种以8为基数的计数法。采用0,1,2,3,4,5,6,7八个数字,逢八进1。js以数字0开始表明该数字是八进制。

十六进制: 计算机中数据的一种表示方法。它由0-9,A-F组成,字母不区分大小写。与10进制的对应                关系是:0-9对应0-9;A-F对应10-15;js以0x开始表明该数字是十六进制。
默认定义的变量是十进制:
var b = 010;
alert(b);  //8
js的进制转换,分为2进制,8进制,10进制,16进制之间的相互转换,我们直接利用对象.toString()
即可实现:
如果要处理2进制到10进制,16进制到10进制,8进制到10进制, 需要用了paresInt这个方法:
进制转换 如果要实现进制之间的转换, 可以利用parseInt方法, 先转化为10进制, 然后再利用toString(参数), 转化成不同的进制。

十九、代码规范

  • 1:代码缩进。
  • 2:+、=等运算符两边的空格。
  • 3:语句结束以分号结尾。
  • 4:小括号的嵌套,要加空格。
  • 5:双引号、单引号的嵌套。

应用:

1:计算两个文本框的和。

请输入数字:<input type="text" id="num1" /><br />
请输入数字:<input type="text" id="num2" /><br />
<input type="submit" value="求和" id="btn" />

<script type="text/javascript">            
  var num1 = document.getElementById('num1');
  var num2 = document.getElementById('num2');
  var btn = document.getElementById('btn');
  btn.onclick = function () {
    var val1 = Number(num1.value);  //value得到的所有值都是字符串
    var val2 =Number(num2.value);
    alert('两个数的和为' + (val1 + val2));
  }
</script>

2:

var k=0;
alert(k++ + ++k +k +k++)。 // 6

3:掌握逻辑运算的意义。

4:掌握八进制、十六进制的写法。

5:掌握NaN的含义。

NaN (not a number) 当数学计算得不到数字结果时,该值就是NaN
isNaN : 判断变量是否是NaN
6:掌握Number函数的转换结果。

综合应用:

计算两个文本框的加减乘除。

  • 要求:
  • 1) 使用parseInt方法类型转换。

2) 计算结果使用Math.round方法四舍五入

   
两个数的加减乘除:<br />
<input type="text" id="num1" />
<input type="text" id="fuhao" />
<input type="text" id="num2" /><br />
<input type="submit" id="btn" value="计算" />

<script type="text/javascript">
  var num1 = document.getElementById('num1');
  var num2 = document.getElementById('num2');
  var fuhao = document.getElementById('fuhao');
  var btn = document.getElementById('btn');
  btn.onclick = function () {
    var val1 = parseInt(num1.value);
    var val2 = fuhao.value;
    var val3 = parseInt(num2.value);
    switch (val2) {
      case '+' :
              alert(Math.round(val1 + val3));
              break;
      case '-' :
              alert(Math.round(val1 - val3));
              break;
      case '*' :
              alert(Math.round(val1 * val3));
              break;
      case '/' :
              alert(Math.round(val1 / val3));
              break;
      default :
              alert('请输入正确的符号');
              break;
    }
  }
</script>

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值