ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript初心者が知らないこと(2)

JavaScript初心者が知らないこと(2)

小云云
小云云オリジナル
2018-03-15 15:04:231217ブラウズ

この記事では、JavaScript の基本的な構文とデータ型を主に説明します。もちろん、まだ最も基本的なものなので、詳細については説明しません。これから始める学生にぜひご覧ください。このタイトルを見ると、単なる構文とデータ型のことだと思いませんか? ほんの少しの知識で、私はすでにそれを知っていました。

1 キーワードと予約語

ECMA-262 は、特定の目的を持つキーワードのセットについて説明します。これらのキーワードは、制御ステートメントの開始または終了を示したり、特定のアクションを実行したりするために使用できます。原則として、キーワードも言語で予約されており、識別子として使用することはできません。以下は ECMAScript のすべてのキーワードです (* が付いているものは第 5 版の新しいキーワードです):

キャッチ続ける関数の場合試してみる
ケース else 新しい var
最後に 戻る 無効
スイッチ の間 デバッガー*
この with デフォルト
投げる 削除

ECMA-262 では、識別子として使用できない別の予約語のセットについても説明しています。ただし、予約語は言語内でまだ具体的に使用されていません。しかし、将来的にはキーワードとして使用される可能性があります。以下はすべて ECMA-262 バージョン 3 で定義された予約語です:

abstract enum int short
ブール値 エクスポート インターフェース 静的
バイト 拡張 長い スーパー
char final ネイティブ 同期
クラス float パッケージ スロー
const goto private transient
デバッガ 実装 保護 揮発性
double インポート 公開

5thこのバージョンでは、非厳密モードで実行する場合の予約語が次のように削減されます:

厳密モードでは、バージョン 5 は次の予約語にも制限を課します:

class enum extends super
定数 エクスポート インポート
プライベート静的レット保護収量

let と yield は第 5 版の新しい予約語であることに注意してください。他の予約語は第 3 版で定義されています。互換性を最大限に確保するために、第 3 版で定義されている予約語に加え、let および yield を参照してプログラミングすることをお勧めします。

ECMAScript 3 を実装する JavaScript エンジンでキーワードを識別子として使用すると、「識別子が必要です」エラーが発生します。予約語を識別子として使用すると、特定のエンジンに応じて同じエラーが発生する場合とそうでない場合があります。

第5版では、キーワードと予約語の使用ルールが若干変更されました。キーワードと予約語はまだ識別子として使用できませんが、オブジェクトのプロパティ名として使用できるようになりました。一般に、将来の ECMAScript バージョンとの互換性を維持するには、キーワードや予約語を識別子やプロパティ名として使用しないことをお勧めします。

上記の予約語とキーワードに加えて、ECMA-262 バージョン 5 では eval と引数に制限が課されます。厳密モードでは、これら 2 つの名前を識別子または属性名として使用することはできません。使用しない場合は、エラーがスローされます。

2 データ型

ECMAscript には、次の 5 つの単純なデータ型 (基本データ型とも呼ばれます) があります。また、複雑なデータ型 (参照データとも呼ばれる) もあります。 type) – オブジェクト、オブジェクトは本質的に、順序付けされていないキーと値のペアのセットです。 ECMAscript はカスタム タイプを作成するメカニズムをサポートしておらず、すべての値は上記の 6 つのデータ タイプのいずれかになります。

typeof

この演算子 (関数ではないため、ここでは関数ではありません) は、通常、デバッグ中に 6 つの戻り値を持ちます: unknown (値が定義されている)、boolean( ブール値)、 string (文字列)、number (数値)、オブジェクト (この値はオブジェクトまたは null)、関数 (この値は関数)。 正規表現に相当し、実際には別の形式のオブジェクト(RegExp型オブジェクト)ですが、Chrome7とSafari5より前のバージョンでは関数を返し、他のブラウザはオブジェクトを返します
以下を見てみましょう 簡単な例を見てみましょう

var msg; //如果没有赋值,默认是undefinedtypeof msg;  //undefined// age 没有定义typeof age; //undefined

この結果は論理的に合理的です。これら 2 つの変数は技術的な観点からは本質的に異なりますが、実際には、これらの変数が実際の演算を実行することは不可能だからです。 初期化されていない変数には自動的に未定義が割り当てられる場合でも、変数を明示的に初期化できる場合は、typeof 演算子が未定義を返したときに、この変数がまだ宣言されていないことを判断できます

null と unknown の関係
console.log(undefined == null)  // trueconsole.log(undefined === null)  // false

実際、ECMA-262 ではそれらの等価性が true を返さなければならないと規定されているため、未定義の値は null から派生します。 null と unknown にはそのような関係がありますが、その用途はまったく異なります。いかなる状況でも変数の値を unknown に設定する必要はありませんが、同じルールは null にも不適切です。オブジェクト変数を保存することを目的としているが、実際の変数が保存されていない限り、変数は明示的に null として保存されるべきだと思います。これは、null ポインターとしての null の規則を反映するだけでなく、null と未定義をさらに区別することもできます

Number 型

Number 型は、ECMAscript で最も重要なデータ型である必要があります。この型は、IEEE754 で使用されます。整数と浮動小数点値を表します

var num1 = 070;  //表示八进制数var num2 = 079   //无效的八进制数  表示79var num3 = 0x1f  //十六进制数

8 進リテラルは厳密モードでは無効であり、JavaScript エンジンがエラーを報告します

浮動小数点値
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var f1 = 0.1; <br>var f2 = .1;  //虽然是有效的0.1但是不推荐var f3 = 1.0; //会自动转换为1</span>

一部の非常に大きい値または極端に小さい値の場合科学表記法でも表現できます

var f4 = 3.125e7; //31250000

在这里还是要提示一下众所周知的浮点数不能比较相等法则,
在javascript中浮点数的最高精度是17位的小数,但在进行算术计算的时候精确度远远不如整数,例如0.1+0.2不等于0.3而是等于0.0000000000000004(4e-17)
这是使用基于IEEE754数据浮点计算的通病

数据范围

由于内存的限制,ECMAscript并不能保存世界上所有的数,能保存的数能在浏览器中显示出来(通过Number.MAX_VALUE),最小值是(Number.MIN_VALUE)
当超出这个范围的时候,大于就变为Infinity,小于就变为-Infinity

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var big = Number.MAX_VALUE + Number.MAX_VALUE;<br>console.log(big);  //Infinity</span>

可以使用isFinite()函数判断这个值是否在最大值和最小值之间,如果在就返回true
通过访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY来得到-Infinity和Infinity

 NaN

NaN,非数值类型(Not a Number)是一个特殊的值,这个数值表示一个应该返回数值的情况结果没有返回数值,在ECMAscript中,任何数值除以0并不会导致错误,会返回一个NaN,因此并不会影响代码的运行。
Nan本身有两个特点:任何设置NaN的操作都会返回NaN,这个特点在多步计算的时候可能导致错误,其次Nan和任何数值都不想等,包括本身:

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>console.log(NaN == Infinity)<br>console.log(NaN == 1)<br>console.log(NaN == NaN)<br>console.log(NaN == 1/0)//以上结果返回的都是false//下面是判断数据类型isNaN(NaN)  //trueisNaN('123') //false,进行了数据类型的转换isNaN('f5') //trueisNaN(4)   //false</span>

运用isNaN()函数可以判断这个变量是否是NaN类型的。
最神奇的是isNaN也是支持对象操作的,在基于对象调用isNaN函数时,会首先调用对象的valueOf方法,然后确定该方法返回的值是否可以转换为数值,如果不能就基于这个返回值再调用toString()方法,在测试返回值

string

对应于string类型,讨论的会比较少一点,string类型用于友零或者多个16位的Unicode字符组成的字符序列,即字符串。js中的单引号和双引号是没有区别的(想对于PHP来讲)。

 字符字面量

转义的只是在这里就不多说了,
字面量在这里只说一点:
var text = "this is \u30a3"这个的长度是9因为\u30a3转义后表示一个字符

字符串的特点

字符串在我们平常的开发当中我们是一直在用的,但是很少人知道其中的原理,下面我们就来讨论一下字符串的特点。
ECMAscript中的字符串是不可变的,也就是说,字符串一旦被创建,他们的值就不能被改变。要改变某个变量保存的字符串就先要销毁原来的字符串,然后用一个新的值来填充该变量,例如下面的代码:
var lang = 'java';
lang = lang + 'script';
以上的代码是变量lang中包含字符串‘java’。而第二行代码把lang的值重新定义为‘java’与’script’的结合,实际上这个操作过程如下:
1. 首先创建一个能容纳10个字符的新字符串
2. 然后将这个字符串中填充’java’和’script’
3. 最后一步是销毁原来的’java’字符串和’script’字符串,因为这两个字符串已经没用了

转换为字符串

在这里主要注意的是null和undefined是没有toString()方法的,如果想要把他们转换为字符串可以使用转型函数String(),能把任何类型的值转换为字符串var val = null;String(val)
当使用数值转换为字符串的时候,可以在toString()传递一个参数,表示把数值变为多少进制的字符串:var num = 10;num.toString(2)返回的是1010;

4 Object类型

ECMAscript中对象其实就是一组数据和功能的集合。
三种实例化一个对象的方法:

var o = new Ocject();var o = new Object;//不推荐使用var o = {};//当今最常用的

object中的对象和属性在后面我们在去讨论

5 JavaScript中+的作用

这个我们在这里说的具体一点
1. 加法运算

console.log(1+2)
  1. 字符串的连接

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>var a ="121",<br>    b =56,<br>    c ="ss";<br>console.log(a+b);//12156console.log(a+c);//121ss</span>
  1. 数值和字符串之间的转换

<span style="font-family: 微软雅黑, "Microsoft YaHei";">//字符串转换我数值var a = "21212";<br/>+a   //21212var b = "ss";<br/>+a //NaNvar c= "0xff";<br/>+a  //255</span>
<span style='font-family: 微软雅黑, "Microsoft YaHei";'>//数值转换为字符串var a =45;<br>+a;  //"45"</span>
//布尔值的转换+true  //1+fasle  //0

6 javascript中-的作用

减号的作用一般是都是用在正规的操作(也就是类型相同)的操作中,信息量虽然不是很大,但是还是有很多需要注意的地方,下面来举几个例子

var a = 5-true;  //4 ,true被转换了var b = NaN -1;//NaNvar c= 5-2   //3var d = 5-"2";//3  “2”被转换为2var e = 5-null; //5  null被转换为了0

7 相等操作符

在我们编程的时候,当使用比较的时候我们希望,有的时候类型不同可以数值一样就可以就好像(2和"2")是可以相等的,但是有时候我们希望要求数值和类型都是一样的才返回真。这就很矛盾了,在ECMAscript中的解决方案是提供两组操作数:相等和全等
相等:先转换在比较
列出一下比较特殊的比较结果

implements package public interface



表达式
null == undefined true
“NaN” == NaN false
NaN == NaN false
NaN != NaN true
true == 2 false
undefined == 0 false
null == 0 false

全等:仅比较不转换
全等就比较严格了,在这里就不讨论什么了。
注意:null == undefined会返回true,但是null === undefined会返回false,这是由于他们的类型不一样

8 函数

函数对于任何语言来说都是一个核心的概念。
在这里主要说一个问题,细节会在后面继续讨论
我们都是知道在函数中的arguments表示所有传进来的参数,比如说

<span style='font-family: 微软雅黑, "Microsoft YaHei";'>function foo(a,b,c){<br>    console.log(arguments[2] === c);//true}</span>

这个原因并不因为他们指向的是同一块内存,因为他们内存空间的值会相互同步,
arguments的值是不能被改写的如果改写的会操作

相关推荐:

JavaScript初学者不知道的事(一)

javascript初学者实践使用

给JavaScript初学者的一些最佳实践

以上がJavaScript初心者が知らないこと(2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。