整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript 中的 NaN

JavaScript 中的 NaN

avaScript 中的数字类型包含整数和浮点数:

const integer=4;
const float=1.5;

typeof integer; //=> 'number'
typeof float;   //=> 'number'
复制代码

另外还有 2 个特殊的数字值:Infinity(比其他任何数字都大的数字)和 NaN(表示“Not A Number”概念):

const infinite=Infinity;
const faulty=NaN;

typeof infinite; //=> 'number'
typeof faulty;   //=> 'number'
复制代码

虽然直接使用 NaN 的情况很少见,但在对数字进行无效的操作后却会令人惊讶地出现。

让我们仔细看看 NaN 特殊值:如何检查变量是否具有 NaN,并了解怎样创建“Not A Number”值。

NaN number

JavaScript 中的数字类型是所有数字值的集合,包括 “Not A Number”,正无穷和负无穷。

可以使用特殊表达式 NaN 、全局对象或 Number 函数的属性来访问“Not A Number”:

typeof NaN;        //=> 'number'
typeof window.NaN; //=> 'number'
typeof Number.NaN; //=> 'number'
复制代码

尽管具有数字类型,但“Not A Number”是不代表实数的值。NaN 可用于表示错误的数字运算。

例如,将数字与 undefined 相乘不是有效操作,因此结果为 NaN:

1 * undefined;     //=> NaN
复制代码

同样尝试解析无效的数字字符串(如 'Joker')也会导致 NaN:

parseInt('Joker', 10); //=> NaN
复制代码

检查 NaN 是否相等

NaN有趣的特性是,即使使用 NaN 本身,它也不等于任何值:

NaN===NaN; //=> false
复制代码

此行为对于检测变量是否为 NaN 非常有用:

const someNumber=NaN;

if (someNumber !==someNumber) {  console.log('Is NaN');
} else {
  console.log('Is Not NaN');
}

// logs "Is NaN"
复制代码

仅当 someNumber 是 NaN 时,someNumber !==someNumber 表达式才是 true。因此,以上代码片段输出到控制台的结果是 "Is NaN"。

JavaScript 通过内置函数来检测 NaN:isNaN() 和 Number.isNaN():

isNaN(NaN); //=> true
isNaN(1);   //=> false

Number.isNaN(NaN); //=> true
Number.isNaN(1);   //=> false
复制代码

这些函数之间的区别在于,Number.isNaN() 不会将其参数转换为数字:

isNaN('Joker12');        //=> true
Number.isNaN('Joker12'); //=> false
复制代码

isNaN('Joker12') 将参数 'Joker12' 转换为数字,即 NaN。因此该函数返回 true 。

另一方面,Number.isNaN('Joker12') 会检查参数是否为 NaN 而不进行转换。该函数返回 false ,因为'Joker12' 不等于 NaN。

导致 NaN 的运算

1 解析数字

在 JavaScript 中,你可以将字符串形式的数字转换为数字。

例如你可以轻松地将字符串 '1.5' 转换为浮点数 1.5:

const numberString='1.5';
const number=parseFloat(numberString);

number; //=> 1.5
复制代码

当字符串不能被转换为数字时,解析函数返回 NaN :表示解析失败。这里有些例子:

parseFloat('Joker12.5'); //=> NaN
parseInt('Joker12', 10); //=> NaN
Number('Joker12');       //=> NaN
复制代码

解析数字时,最好先确认解析结果是否为 NaN :

let inputToParse='Invalid10';
let number;

number=parseInt(inputToParse, 10);
if (isNaN(number)) {  number=0;
}

number; //=> 0
复制代码

解析 inputToParse 失败,因此 parseInt(inputToParse, 10)返回 NaN。条件 if (isNaN(number)) 为 true,并且将 number 赋值为 0。

2undefined 作为操作数

把 undefined 用作加法、乘法等算术运算中的操作数会生成 NaN。

例如:

function getFontSize(style) {
  return style.fontSize;
}

const fontSize=getFontSize({ size: 16 }) * 2;
const doubledFontSize=fontSize * 2;

doubledFontSize; //=> NaN
复制代码

getFontSize() 是从样式对象访问 fontSize 属性的函数。调用 getFontSize({ size: 16 }) 时,结果是undefined(在 { size: 16 } 对象中不存在 fontSize 属性)。

fontSize * 2 被评估为 undefined * 2,结果为 NaN。

当把缺少的属性或返回 undefined 的函数用作算术运算中的值时,将生成 “Not A Number”。

防止 NaN 的好方法是确保 undefined 不会进行算术运算,需要随时检查。

3NaN 作为操作数

当算数运算的操作数为 NaN 时,也会生成NaN 值:

1 + NaN; //=> NaN
2 * NaN; //=> NaN
复制代码

NaN 遍及算术运算:

let invalidNumber=1 * undefined;
let result=1;
result +=invalidNumber; // appendresult *=2;             // duplicate
result++;                // increment

result; //=> NaN
复制代码

在将 invalidNumber 值(具有 'NaN')附加到 result之后,会破坏对 result 变量的操作。

4 Indeterminate 形式

当算术运算采用不确定形式时,将会产生 NaN 值。

0/0 和 Infinity/Infinity 这样的的除法运算:

0 / 0;               //=> NaN
Infinity / Infinity; //=> NaN
复制代码

0 和 Infinity 的乘法运算:

0 * Infinity; //=> NaN
复制代码

带有不同符号的 Infinity 的加法:

-Infinity + Infinity; //=> NaN
复制代码

5 无效的数学函数参数

负数的平方根:

Math.pow(-2, 0.5); //=> NaN
(-2) ** 0.5;       //=> NaN
复制代码

或负数的对数:

Math.log2(-2); //=> NaN
复制代码

总结

JavaScript 中用 NaN 表示的的“Not A Number”概念对于表示错误的数字运算很有用。

即使是 NaN 本身也不等于任何值。检查变量是否包含 NaN 的建议方法是使用 Number.isNaN(value)。

将字符串形式的数字转换为数字类型失败时,可能会导致显示“Not A Number”。检查 parseInt()、parseFloat() 或 Number() 是否返回了 NaN 是个好主意。

undefined 或 NaN 作为算术运算中的操作数通常会导致 NaN。正确处理 undefined(为缺少的属性提供默认值)是防止这种情况的好方法。

数学函数的不确定形式或无效参数也会导致 “Not A Number”。但是这些情况很少发生。 这是我的务实建议:出现了 NaN?赶快检查是否存在 undefined!


作者:前端先锋
链接:https://juejin.cn/post/6844904047787376654
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

网页中添加视频、声音、动画等,可以增强用户体验。在HTML5之前,为网页添加多媒体的唯一办法,就是使用第三方的插件(如,Adobe Flash等)。

HTML5中,提供了对多媒体的原生支持,只需通过 video 元素,就可以向网页嵌入视频、电影或音频资源,通过 audio 元素向网页嵌入音频资源,省时省力。

HTML中嵌入视频和音频代码

一、视频

在HTML5时代,在网页中嵌入视频非常简单,只需要一个 video 元素,并设置它的 src 属性,使其链接一个视频地址就可以完全搞定了,这个太esay了

<video src="media/vedio.mp4"></video>

把这个网站在IE8中打开一看,网站上除了一片空白外,什么也没有,这是为什么呢?

原来 video 是HTML5最新引入的元素,并不是所有浏览器都支持它,IE8及以下版本都无法识别 video 标签。如果浏览器不识别 video标签,则会忽略它,当做什么都没有。这就是网站上一片空白的原因。

这个问题好解决,只需在 video 标签之间放置文本信息,不支持 video 标签的老浏览器,会显示 video 标签之间的文本信息,以提示用户浏览器不支持 video,就这么简单!

<video src="media/vedio.mp4">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在IE8上打开一看,确实显示了提示文本,这下好多了,至少用户知道自己的浏览器不能播放视频,该换浏览器了。

下载了Opera浏览器的最新版本25.0,打开一看,怎么还是一片空白外!Opera浏览器明明是支持video标签的,那又是为什么呢?

这个就得从视频的编码格式说起了。video 元素支持三种视频格式:Ogg、MP4、WebM。

Ogg是带有Theora视频编码和Vorbis音频编码的文件,后缀名为 .ogg;MP4是带有H.264视频编码和AAC音频编码的MP4文件,后缀名为 .mp4;WebM是VP8视频编码和Vorbis音频编码的文件,后缀名为 .webm。

这个Opera浏览器呢,它可以支持ogg,但不支持mp4。由于Opera支持video标签,故video标签之间的文本信息没有显示出来,但它不支持ogg,所以就不进行播放,最终导致页面出现一片空白。这下可怎么办呢?

其实办法有的是,我们可以从网上下载一副图像,放到视频播放窗口,如果视频无法播放,就显示这张图片,是不是更好呢?从网上下载一张美女图片,干脆叫beauty.jpg吧。那这个图像怎么添加到视频窗口呢?

video标签有个poster 属性,就是专门在视频窗口放置图片的。poster是一个video的占位符,无论什么情况下,只要视频还没有播放(视频下载过程中、视频不存在、不支持该视频类型、用户点击播放按钮前),就会显示该图像,可以看做是视频播放之前插入的宣传画或海报。

<video src="media/vedio.mp4" poster="img/beauty.jpg">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在Opera浏览器上刷新一下,真的有一个美女冲着自己微笑呢。虽然视频没有播放出来,这回心情却是好多了。

那我可不能一天到晚只看美女呀,视频还是还是要想办法播放出来的。既然Opera浏览器不支持mp4,我们就换成需要ogg吧,这样就肯定没问题了。

我想了想,这个办法不好,万一某个浏览器只支持支持ogg,不支持mp4呢。这年头,什么都缺,就是不缺点子,随便在网上一搜,办法就有了。

在 video 元素中添加 source 元素,就可以解决这个问题。在source 元素中,通过 src 属性指定视频的地址,通过 type 属性指定视频的类型,以帮助浏览器决定是否能播放该视频。并且,在 video 元素中可以添加任意多个source 元素,让不同的 source 元素链接到不同的视频文件。

这样的话,当浏览器发现 video 元素时,首先会查看它本身是否定义了 src 属性。如果没有,就会检查 source 元素。浏览器会逐个查看这些视频源,直到找到一个可以播放的视频。一旦找到,就会播放它并忽略其他的视频源。我们干脆添加两个source,一个是mp4,一个是ogg,这下视频是一定能播放出来了。

<video poster="img/beauty.jpg">

<source src="media/vedio.mp4" type="video/mp4">

<source src="media/vedio.ogg" type="video/ogg">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

在Opera浏览器上又刷新一下,只有美女冲着我微笑,视频还是没播放出来。唉,太粗心了,忘记添加播放视频的控件了。

在video标签中,通过添加controls 属性来为视频添加播放控件,方便用户执行播放、暂停操作和音量控制。

<video poster="img/beauty.jpg" controls>

(此处略去500字…)

</video>

在Opera浏览器上又刷新一下,效果真的不一样,这次不仅看到美女,还看到了视频控件。用鼠标猛戳一下那个播放按钮,哈哈,不错,真的听到美妙的旋律。我们的ogg文件,终于播放出来了,让我们好好享受一下吧O(∩_∩)O。

听了一会,忽然一想,不对呀,我刚才点了播放按钮后,等了半天才听到声音。能不能我一点播放按钮,就立即播放呢?

原来视频也是需要下载缓存的,点击播放按钮后,首先缓存,然后才播放的。那能不能在页面加载的同时就缓存呢。这样,用户点击播放后,就不必等待了。

这当然可以,在video标签中,通过添加preload属性来为视频添加预加载功能,在页面加载的同时加载视频。

<video poster="img/beauty.jpg" controls preload>

(此处略去500字…)

</video>

关于 preload 属性,稍微再啰嗦一点,就是可以把它设置为 metadata,让浏览器仅仅预加载视频的基本信息,如尺寸、时长、以及一些关键的帧。这样的话,在开始播放之前,浏览器可以提前计算视频的显示尺寸。

既然一切都OK了!让我们看看mp4是不是能正常播放。下载最新版的Google Chrome 38.0浏览器,打开网页,猛戳一下播放按钮。

等等~,等等~,不对,怎么只有声音没有画面,明明是mp4格式的文件呀?使用暴风影音试了一下,是有画面的呀!

辛辛苦苦又在网上搜了一番,花了整整586秒,终于找到了答案。mp4视频需要h.264编码格式才会有图像的。

找了一个 h.264 编码格式的 mp4 试了一下,不错,确实有图像了!看了半天,原来是一部老外的电影,叽里咕噜一阵,一句话也没听懂。那O(∩_∩)O~,能否提供中文字幕呢,这样就不必费老大劲去听了!

HTML5中,通过在video元素添加track元素为视频添加字幕。字幕文件有两种格式:WebVTT和TTML。WebVTT是Web视频文本轨迹(Web Video Text Track),是UTF-8编码格式的文本文件;TTML是时序文本标记语言(Timed Text Markup Language),是XML格式的文件。两种文件的具体格式,已经超出我们的讨论范围。

video元素支持添加多个track元素,不同的track元素链接到不同的字幕文件。用户可以在各个字幕间进行切换。

<video poster="img/beauty.jpg" controls preload>

<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>

<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">

</video>

track元素中,src属性指定字幕文件的URL;srclang属性字幕文件的语言类型,若kind 属性值是 "subtitles" 时,该属性必需的;label 属性指定字幕标签,每个字幕元素必需设置一个唯一不重复的标签,切换字幕时,会显示标签的名称;kind指定字幕内容类型,只能是subtitles、captions、descriptions、chapters、metadata 之一;default属性指定是否是默认字幕,如果一个都没指定,将不会自动显示字幕。

除了字幕外,我还希望对视频进行过多的控制,比如让视频自动播放、循环播放、默认静音,以及视频窗口的尺寸等等,这些都能做到吗?

这已经不是什么事了,video 元素已经提供了相关属性,根据需要设置相应的属性就可以了。这些属性及含义见表 23:

HTML中嵌入视频和音频代码

哦,原来这么简单呀!那就到此为止吧,网页中嵌入视频的全部代码都在这里,就打包给你吧!

<video width="300" poster="img/beauty.jpg" controls preload autoplay loop muted>

<source src="media/vedio.mp4">

<source src="media/vedio.ogg">

<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>

<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">

你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!

</video>

睁大眼睛一看,却只有7行代码。然而,就这区区7行代码,可把他折磨得够呛。

看着这一切都全部搞定,他仰望着天空,长长呼了一口气,显得是那么的放松,那么的惬意。此时,他闭上眼睛,在自己的梦幻世界里遨游!


二、音频

有了在网页中嵌入视频的经历,要在网页中嵌入音频,那简直就是小菜一碟了。只要把vedio元素换成 audio 元素,就全部搞定。

但需要了解的是,audio 所支持的音频格式只有Ogg Vorbis、mp3 和 wav。还要知道,由于音频没有画面,也就没有 width、height、poster 属性,而其他属性都支持,并且跟视频的含义相同。

网页中嵌入音频的代码如下:

<audio controls preload autoplay loop muted>

<source src="media/audio.mp3">

<source src="media/audio.wav">

<source src="media/audio.ogg">

你的浏览器已经老掉牙了,不支持audio,还不赶快使用现代浏览器O(∩_∩)O~!

</audio>

程序员web前端分享html中meta标签及用法详解,这篇文章给大家介绍了html中meta标签及用法详解,感兴趣的朋友一起看看,Html中meta标签

一、meta标签 含义

<meta> 元素 可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。

<meta> 标签位于文档的头部,不包含任何内容。

<meta> 标签的属性定义了与文档相关联的名称/值对。

二、meta 中常用属性

1. charset (字符集)

说明:规定 HTML 文档的字符编码。

用法: <meta charset="UTF-8">

2. viewport (视区)

说明:是用户网页的可视区域。 大家都知道移动设备的屏幕一般都比PC小很多,webkit浏览器会将一个较大的“虚拟”窗口映射到移动设备的屏幕上,默认的虚拟窗口为980像素宽(目前大部分网站的标准宽度),然后按一定的比例(3:1或2:1)进行缩放。

 也就是说当我们加载一个普通网页的时候,webkit会先以980像素的浏览器标准加载网页,然后再缩小为490像素的宽度。注意这个缩小是一个全局缩小,也就是页面上的所有元素都会缩小。

用法:

<meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;">

(1) width

width 控制 viewport 的大小,一般为了自适应设置为device-width

(2) initial-scale

initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。

(3) maximum-scale

maximum-scale 最大缩放。即允许的最大缩放程度。这也是一个浮点值,用以指出页面大小与屏幕大小相比的最大乘数。

(4) minimum-scale

minimum-scale:允许用户缩放到的最小比例。和 maximum-scale 用法类似。

(5) user-scalable

user-scalable 用户调整缩放。即用户是否能改变页面缩放程度。如果设置为yes则是允许用户对其进行改变,反之为no。

3. keywords (关键字)

说明:为搜索引擎提供的关键字列表。各关键词间用英文逗号“,”隔开。指定搜索引擎用来提高搜索质量的关键词。

用法:<Meta name="Keywords" Content="关键词1,关键词2,关键词3,关键词4,……">

4. description (描述、简介)

说明:Description用来告诉搜索引擎你的网站主要内容。

用法:<Meta name="Description" Content="你网页的简述">

5. format-detection (格式检测)

说明:format-detection 是用来检测html里的一些格式的。

用法:关于meta的format-detection属性主要是有以下几个设置:

meta name="format-detection" content="telephone=no"
 meta name="format-detection" content="email=no"
 meta name="format-detection" content="adress=no"

也可以连写:meta name="format-detection" content="telephone=no,email=no,adress=no"

(1)telephone

你明明写的一串数字没加链接样式,而iPhone会自动把你这个文字加链接样式、并且点击这个数字还会自动拨号!想去掉这个拨号链接该如何操作呢?这时我们的meta又该大显神通了,代码如下:

telephone=no就禁止了把数字转化为拨号链接!

telephone=yes就开启了把数字转化为拨号链接,要开启转化功能,这个meta就不用写了,在默认是情况下就是开启!

(2)email

告诉设备不识别邮箱,点击之后不自动发送

email=no禁止作为邮箱地址!

email=yes就开启了把文字默认为邮箱地址,这个meta就不用写了,在默认是情况下就是开启!

(3)adress

adress=no禁止跳转至地图!

adress=yes就开启了点击地址直接跳转至地图的功能,在默认是情况下就是开启!

6. apple-touch-fullscreen

说明:添加到主屏幕后,全屏显示。

用法:<meta name="apple-touch-fullscreen" content="yes">

7. apple-mobile-web-app-capable

说明: 作用就是删除默认的苹果工具栏和菜单栏。content有两个值”yes”和”no”,当我们需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示。

用法:<meta name="apple-mobile-web-app-capable" content="yes" />

8. App-Config

说明:保留历史记录以及动画效果

用法:<meta name="App-Config" content="fullscreen=yes,useHistoryState=yes,transition=yes"/>

9. msapplication-tap-highlight

  说明:点击无高光(高亮)

 用法:<meta name="msapplication-tap-highlight" content="no">

以上所述是好程序员给大家介绍的html中meta标签及用法详解,希望对大家有所帮助。