JS_高程5.引用类型(3)Array类型-检测数组

本文介绍了JavaScript中检测一个变量是否为数组的三种方法:instanceof操作符、Array.isArray()方法及Object.prototype.toString.call()方法。详细解释了每种方法的语法、应用场景及局限性。

1. instanceof操作符(ECMAScript3)

  对于一个网页,或者是一个全局作用域而言,使用instanceof操作符来检测数组就可以得到满意的结果。

  语法:if(value instanceof Array){

      //对数组执行某些操作

    }

eg:

1  var colors=["red","pink"];
2     var n=18;
3     var isArray=colors instanceof Array;//返回true
4     var isArray1=n instanceof Array;//返回false
5     alert(isArray);
6     alert(isArray1);

 

注意:

  instanceof操作符在存在多个全局作用域(像一个页面包含多个框架frame)的情况下,var isArray=value instanceof Array;要返回true,value必须是数组,而且还必须与Array构造函数在同一全局作用域中。(Array是window的属性)如果value是另一个框架中定义的数组,那么会返回false。

  instanceof具体的用法参考  https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/#icomments

  

2. Array.isArray()方法(ECMAScript5)

语法:

  if(Array.isArray(value)){

    //对数组执行某些操作

  }

eg:

  

1 var colors=["red","pink"];
2     var n=18;
3     var isArray=Array.isArray(colors);//返回true
4     var isArray1=Array.isArray(n);//返回flase
5     alert(isArray1);
6     alert(isArray);

注意:

  支持Array.isArray()方法的浏览器有IE9+,Firefox 5+,Opera 10.5+和Chrom。要在尚未实现这个方法的浏览器中准确检查数组,参考下面的方法。

 

  由于在任何值上调用Obiect原生的toString()方法,都会返回[object NativeConstructorName]格式的字符串。

eg:

1 var colors=["red","pink"];
2     var number1=20;
3     var obj=new Object();
4     alert(Object.prototype.toString.call(colors));//"[object Array]"
5     alert(Object.prototype.toString.call(number1));//"[object Number]"
6     alert(Object.prototype.toString.call(obj));//"[object Object]"

  由于原生的构造函数与全局作用域无关因此使用toString()就能保证返回一致的值。利用这一点,可以创建如下函数进行判断:高程书P597

1  function isArray(value){
2         return Object.prototype.toString.call(value)=="[object Array]";
3     }

 

转载于:https://www.cnblogs.com/LinSL/p/6197126.html

``` // 加载徐州市边界 var xuzhou = ee.FeatureCollection("projects/ee-xytsres/assets/xuzhou"); // 使用MODIS MAIAC AOD数据 (1km分辨率) var modis = ee.ImageCollection('MODIS/006/MCD19A2_GRANULES') .filterDate('2021-01-01', '2021-12-31') .filterBounds(xuzhou) .map(function(image) { // 修改点1:正确质量波段名称改为'AOD_QA' var qa = image.select('AOD_QA'); // 修改点2:保持质量筛选逻辑但使用正确波段 var mask = qa.bitwiseAnd(3).eq(0); // 选择最高质量数据 return image.select('Optical_Depth_047') .multiply(0.001) .updateMask(mask) .set('system:time_start', image.get('system:time_start')); }); // 降尺度到30米分辨率 var downscaleAOD = function(aodImage) { var dem = ee.Image('USGS/SRTMGL1_003').clip(xuzhou); var ndvi = ee.ImageCollection('MODIS/006/MOD13A2') .filterDate('2021-01-01', '2021-12-31') .mean() .select('NDVI') .multiply(0.0001); return aodImage .resample('bilinear') .reproject({crs: 'EPSG:4326', scale: 250}) .addBands(dem) .addBands(ndvi) .reduceResolution({ reducer: ee.Reducer.linearRegression(2, 1), maxPixels: 1024 }) .reproject({crs: 'EPSG:4326', scale: 30}); }; // 生成年均AOD var annualAOD = downscaleAOD(modis.mean().clip(xuzhou)); // 可视化 Map.centerObject(xuzhou, 8); // 修改点3:选择正确的输出波段'coefficients' Map.addLayer(annualAOD.select('coefficients'), {min: 0, max: 1, palette: ['blue', 'yellow', 'red']}, 'Downscaled AOD'); // 导出结果 Export.image.toDrive({ image: annualAOD.select('coefficients'), description: 'Xuzhou_MODIS_AOD_2021', scale: 30, region: xuzhou, maxPixels: 1e13, fileFormat: 'GeoTIFF' });```在GEE上运行这段代码时,出现了这个问题:Downscaled AOD: Layer error: Image.visualize: Attempt to use array input on non array algorithm.,请你帮我修改这段代码
04-03
绘制的有很大问题,下面的代码绘制的没啥问题,分析一下下面的代码做了什么工作,总结经验import * as Cesium from "cesium"; import computerAngle from "../angle"; let myAngle = new computerAngle(); let sectorNum = 0; // 存储高程数组 let height = []; // 地图容器对象 let v; /** * 扇形实体 */ class SectorGraphics { /** *扇形实体参数计算方法 * @param {Object} parameter -实体默认配置项 * @param {Array} parameter.clickPointH -绘制扇形的3个坐标点,其中AB两个点确定扇形的起始线和半径r,C点确定扇形弧度大小 * @param {Cesium.Viewer} parameter.viewer -地图主窗口 * @return {Cesium.Entity} -返回扇形实体 */ draw(parameter) { let xy = parameter.clickPointH; v = parameter.viewer; for (let i = 2; i < xy.length; i = i + 3) { height.push(xy[i]); } // 计算扇形起始线和正北的夹角 let AB = xy.slice(0, 6); let Pab = myAngle.angle(AB); // 计算扇形终点线和正北的夹角 let AC = [...xy.slice(0, 3), ...xy.slice(6, 9)]; let Pac = myAngle.angle(AC); // 如果C点是往北边画的,则置换两个角度,方便计算 Pab[0] > Pac[0] ? ([Pab[0], Pac[0]] = [Pac[0], Pab[0]]) : []; if ( // 当B点在A点西部,且C点在A点东北部的时候||当B点在A点东部,且C点在A点西北部的时候 (xy[3] > xy[0] && xy[7] > xy[1] && xy[6] < xy[0]) || (xy[3] < xy[0] && xy[7] > xy[1] && xy[6] > xy[0]) ) { [Pab[0], Pac[0]] = [Pac[0], 360 + Pab[0]]; } return this.drawNow(xy[0], xy[1], Pab[0], Pac[0], Pab[1], parameter); } drawNow(x, y, Pab, Pac, ac, p) { let id = "扇形" + (sectorNum == 0 ? "" : sectorNum); let points = []; // 地球两极稍扁,赤道略鼓 // 计算椭球体中心到圆心的距离(纬度越接近极点,则使用短半径,否则使用长半径) let oa = 6378137 - ((6378137 - 6356752) * y) / 90; // 计算圆心在赤道面的垂足投影长度(米) let oh = oa * Math.cos((y * Math.PI) / 180); for (let i = Pab, j = 0; i <= Pac; i += 0.03, j++) { // 计算距离坐标点ac米,方位角为i处的坐标点到圆心的X,Y轴距离(米) let clon = ac * Math.sin((i * Math.PI) / 180); let clat = ac * Math.cos((i * Math.PI) / 180); // 在圆心坐标上叠加X,Y轴弧度(弧度=周长/半径)后的新坐标 let jlon = ((clon / oh + (x * Math.PI) / 180) * 180) / Math.PI; let jlat = ((clat / oa + (y * Math.PI) / 180) * 180) / Math.PI; j > 2 ? (j = 2) : ""; points.push(jlon, jlat, height[j]); } points.push(x, y, height[0]); var sector = new Cesium.Entity({ id, polygon: { show: true, hierarchy: { positions: Cesium.Cartesian3.fromDegreesArrayHeights(points), }, height: 2000, extrudedHeight: 10, material: Cesium.Color.fromCssColorString(p.entityColor || "#007acc"), heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, }, }); sectorNum++; // 添加实体时新增,视图缩放至实体 v.entities.add(sector); v.zoomTo(sector); return sector; } } const Sector = new SectorGraphics(); export function drawSector(a) { let entity = Sector.draw(a); return entity; }
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值